首页 > 解决方案 > 使用 python 抓取网页 - 不断从 jquery 表中获取重复的第一行值

问题描述

试图从这个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']

我忽略了什么简单的事情?

标签: pythonseleniumweb-scraping

解决方案


尝试以下代码以获得所需的输出:

output = [item.text for item in driver.find_elements_by_tag_name('summary')]

PS 请注意,如果要获取每个的后代,则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

推荐阅读