【问题标题】:Unable to parse a certain value from a webpage无法解析网页中的某个值
【发布时间】:2018-01-25 02:45:57
【问题描述】:

我已经在 python 中结合 selenium 编写了一些代码,以从网站上抓取“纬度”,在本例中为“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:

【问题讨论】:

    标签: python python-3.x selenium selenium-webdriver web-scraping


    【解决方案1】:

    这里的问题是所需的文本不在&lt;abbr&gt; 标签内,而是在它的父标签&lt;td&gt; 标签内。要查找元素的父元素,可以将 XPath 的 双点 语法与 .find_element_by_xpath("..") 结合使用。此外,通过类名查找&lt;abbr&gt; 比使用它的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,为您提供清晰有效的解决方案。非常感谢有关为什么应应用 (..) 语法的 oneliner 解释或任何链接。原谅我的无知,再次感谢。
    • 很高兴为您提供帮助!我不认为 selenium 有类似于 bs4 的 .findParent 的东西,所以这绝对是一个workaround,虽然这似乎是最好的方法,你可以检查这个 XPath 的语法“解释” this w3schools page.
    猜你喜欢
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2020-02-22
    相关资源
    最近更新 更多