Python Selenium无法通过xpath找到表元素

Python Selenium无法通过xpath找到表元素,python,selenium,xpath,Python,Selenium,Xpath,以下是该表在网页上的外观(只有一列): 以下是我正在尝试清理的表格的HTML: 如果有必要,该表将嵌套在另一个表中 这是我的密码: def filter_changed_records(): # Scrape webpage for addresses from table of changed properties row_number = 0 results_frame = locate_element( '

以下是该表在网页上的外观(只有一列):

以下是我正在尝试清理的表格的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
如您所见,有一个id为
row0FC
标记。此表是动态生成的,每个新的
都会获得一个编号不断增加的id:
row0FC、row1FC、row2FC
等。这就是我计划迭代所有条目并将它们添加到列表中的方式

我的locate_元素函数如下所示:

    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

您的
XPath
似乎不正确

请尝试以下内容:

address = locate_element("//tr[@id='row%sFC']/td" % row_number)
还要注意,
地址
是一个
网页元素
。如果要获取其文本内容,应使用

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

使用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行selenium,所以如果差异不大的话,我不想花时间切换到beautifulsoup。这取决于您从中获取信息的页面数量以及您使用selenium获取的元素数量。如果是一次性的,时间不重要,坚持硒。在以后的项目中,如果速度很重要的话,可以用其他方法解析代码……我只是做了一个速度测试。设置如下。我使用selenium从白页中提取数据。1页,点击率为100。每个点击都包含一个结果块,其中包含姓名、地址和电话号码。我为selenium和BeautifulSoup(html.parser)做了10个循环,提取了姓名、地址和电话号码(3个查找命令)——这两个查找命令总计3010个查找命令(10个循环*100人*3+10*1个查找结果块命令)。喝汤的总时间是13秒。持续165秒,这让汤的速度快了12倍。哇。太棒了。我想我会迁移,如果你只输入包含数据的html部分(我在本例中就是这样做的),你的速度会比我在回答中所做的(我使用driver.page_source输入了soup)有所提高。这是这样做的:
container=driver。通过\u css\u选择器('div.relevant.section')查找\u元素。获取\u属性(“outerHTML”)
,然后只将容器对象馈送到BeautifulSoup,而不是整个html页面。不幸的是,运气不好。它仍然找不到它。xpath是否也需要通过父表进行路由,或者这不会影响它?能否检查
表是否位于
iframe
中。另外,添加
HTML
,使其与文本相同,而不是与框架中的图像相同。我删掉了那部分,用这些行编辑了帖子中的原始代码。您是否在
locate\u element()
定义中遗漏了
return元素
。是的,我有
locate_element()
适用于大量其他内容,因此该位不是问题所在。