【问题标题】:Python Selenium unable to find table element by xpathPython Selenium 无法通过 xpath 找到表格元素
【发布时间】:2017-12-12 01:37:30
【问题描述】:

这是表格在网页上的样子(只有一列):

这是我要抓取的表格的 HTML:

如果重要,该表嵌套在另一个表中。

这是我的代码:

    def filter_changed_records():
        # Scrape webpage for addresses from table of changed properties
        row_number = 0
        results_frame = locate_element(
            '//*[@id="oGridFrame"]'
        )
        driver.switch_to.frame(results_frame)
        while True:
            try:
                address = locate_element("id('row" + str(row_number) +
                                         "FC')/x:td")
                print(address)
                changed_addresses.append(address)
                row_number += 1
            except:
                print("No more addresses to add.")
                break

如您所见,有一个<tr> 标记,其ID 为row0FC。此表是动态生成的,每个新的<tr> 都会获得一个编号不断增加的 id:row0FC, row1FC, row2FC 等。这就是我计划遍历所有条目并将它们添加到列表中的方式。

我的 locate_element 函数如下:

    def locate_element(path):
        element = WebDriverWait(driver, 50).until(
            EC.presence_of_element_located((By.XPATH, path)))
        return element

它总是在 50 秒后从找不到元素开始超时。不确定如何进行。有没有更好的定位元素的方法?

安德森的解决方案

address = locate_element("//tr[@id='row%sFC']/td" % row_number).text

【问题讨论】:

    标签: python selenium xpath


    【解决方案1】:

    您的XPath 似乎不正确。

    试试下面:

    address = locate_element("//tr[@id='row%sFC']/td" % row_number)
    

    还要注意addressWebElement。如果你想获取它的文本内容,你应该使用

    address = locate_element("//tr[@id='row%sFC']/td" % row_number).text
    

    【讨论】:

    • 不幸的是,没有运气。它仍然找不到它。 xpath 是否也需要通过父表路由,还是不会影响它?
    • 您能否检查您的table 是否位于iframe 内。还要添加HTML 与文本相同,而不是图像
    • 它在一个框架中。我留下了那部分,用这些行在帖子中编辑了原始代码。
    • 您是否在您的locate_element() 定义中错过了return element
    • 不知何故被切断了。是的,我有那个。 locate_element() 适用于大量其他东西,所以这不是问题。
    【解决方案2】:

    用 selenium 解析 html 很慢。我会为此使用 BeautifulSoup。

    假设您已经在驱动程序中加载了页面,它会是这样的:

    from bs4 import BeautifulSoup
    ....
    
    soup = BeautifulSoup(driver.page_source, "html.parser")
    td_list = soup.findAll('td')
    for td in td_list:
        try:
            addr = td['title']
            print(addr)
        except:
            pass
    

    【讨论】:

    • 速度差异是否足以证明将我的整个脚本迁移到它是合理的?硒大约有 500 行,所以如果差别不大,我不想花时间切换到 beautifulsoup。
    • 这取决于您从中获取信息的页面数量以及您使用 selenium 获取的元素数量。如果它是一次性的并且时间不重要,请坚持使用硒。如果速度很重要,在未来的项目中用其他东西解析代码......
    • 我刚刚做了一个速度测试。设置如下。我使用 selenium 从白页中提取数据。 1 个点击量为 100 的页面。每个命中都包含在一个包含姓名、地址和电话号码的结果块中。我为 selenium 和 BeautifulSoup (html.parser) 做了 10 个循环,在其中我提取了姓名、地址和电话号码(3 个查找命令)——对于 BeautifulSoup 和 Selenium,总共有 3010 个查找命令(10 个循环 * 100 人* 3 + 10*1 查找结果块命令)总共。加汤的总时间是 13 秒。硒 165 秒 - 使汤快约 12 倍。
    • 哇。棒极了。我想我会迁移
    • 如果你只喂汤的 html 的一部分,它保存你的数据(我在例子中做了)与我在我的回答中所做的相比,你的速度提高了(我用驱动程序.page_source)。这样做是这样的:container = driver.find_element_by_css_selector('div.relevant.section').get_attribute("outerHTML") 然后只将容器对象提供给 BeautifulSoup 而不是整个 html 页面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多