无法从网页中解析出特定的值

3
我已经使用Python和Selenium编写了一些代码,用于从一个网站上抓取"Latitude"数据,例如"49°57'09"N (49.952500)",但不知何故,我却得到了TimeoutException异常。我无法理解自己的错误在哪里。如果您能提供任何帮助,我将不胜感激。
以下是我正在尝试的脚本:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("http://www.gcmap.com/airport/EDEF")
wait = WebDriverWait(driver, 10)

driver.switch_to_frame(0)
for item in wait.until(EC.presence_of_all_elements_located((By.XPATH, "//table[contains(@class,'vcard')]//td/abbr[@class='latitude']"))):
    print(item.text)  
driver.quit()

纬度所在的元素:

<td colspan="2" nowrap=""><abbr class="latitude" title="49.952500"></abbr>49°57'09"N (49.952500)</td>

这是我得到的错误信息:

80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:
1个回答

3
这里的问题在于所需文本不在<abbr>标签内,而是在其父元素<td>标签内。您可以使用XPath的双点语法和.find_element_by_xpath("..")来查找元素的父级。此外,按类名查找<abbr>比使用XPath更加简洁。请注意,以下代码无需等待(显式或隐式)即可工作:
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://www.gcmap.com/airport/EDEF")

item = driver.find_element_by_class_name('latitude')
itemParentText = item.find_element_by_xpath("..").text

>>> print(itemParentText)
49°57'09"N (49.952500)

感谢Vinícius Aguiar,为您的犀利而有效的解决方案。如果能给出一行代码的解释或者任何关于为什么应该使用(..)语法的链接,我将非常感激。请原谅我的无知,再次感谢。 - SIM
很高兴能帮忙!我认为selenium没有类似于bs4的.findParent,所以这肯定是一个变通方法,尽管它似乎是做这件事情的最佳方式,你可以在这个w3schools页面中检查XPath的语法“解释”。 - Vinícius Figueiredo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接