Python Selenium无法通过xpath找到表元素
以下是该表在网页上的外观(只有一列): 以下是我正在尝试清理的表格的HTML: 如果有必要,该表将嵌套在另一个表中 这是我的密码: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( '
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()
适用于大量其他内容,因此该位不是问题所在。