长期潜伏在这里......从来没有问过问题;这里有很多有用的东西。我是一个蟒蛇新手,我觉得这个问题的答案应该是显而易见的,但是我已经盯着它看了一个小时。
尝试从此https://apps.neb-one.gc.ca/REGDOCS/Search/SearchAdvancedResults?p=4抓取“名称”列的列表,这是我的简单代码:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://apps.neb-one.gc.ca/REGDOCS/Search/SearchAdvancedResults?
p=4')
driver.implicitly_wait(5)
rows = driver.find_elements_by_xpath('//*[@id="details-
elements"]/table/tbody/tr')
output = []
for row in rows:
title = row.find_element_by_xpath('//*[@id="details-
elements"]/table/tbody/tr/td[1]/details/summary/a').get_attribute('text')
output.append(title)
driver.close()
print(output)
部分有效。但由于某种原因,代码将只返回20个项目(正确长度)的列表,其中包含重复的第一行的名称(正确的列)(呃...如此接近)。像这样:
['Receipt - Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5', 'Receipt -
Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5', 'Receipt - Accusé de réception - A6F0I5']
我忽略了什么简单的事情?提前谢谢!
答案 0 :(得分:1)
尝试使用以下代码获取所需的输出:
output = [item.text for item in driver.find_elements_by_tag_name('summary')]
P.S。请注意,如果要获取每个row
的后代,则需要在XPath表达式的开头指定点(上下文):
for row in rows:
row.find_element_by_xpath('.//descendant_node') # '//descendant_node' will always return you the first found node in DOM