【问题标题】:Facing issues while scraping data from a table using python with selenium使用带有 selenium 的 python 从表中抓取数据时遇到问题
【发布时间】:2017-06-24 10:55:49
【问题描述】:

我已经编写了一个脚本,使用 python 和 selenium 来解析目标页面中的表,为了清楚起见,我在下面尝试描述了一些步骤,可以访问该目标页面。它确实到达了目的地,但是在从该表中抓取数据时它会在控制台中抛出一个错误,显示“无法找到元素”。我尝试使用在线 xpath 测试器查看它是否错误,但我发现我在脚本中用于“td_data”的 xpath 是正确的。我想,我在这里缺少的东西超出了我的知识范围。希望有人来看看它并为我提供解决方法。 顺便说一句,网站链接在我的脚本中给出。

查看表格 html 内容的链接:“https://www.dropbox.com/s/kaom5qzk78xndqn/Partial%20Html%20content%20for%20the%20table.txt?dl=0

到达我的脚本能够维护的目标页面的步骤:

  1. 选择“我已阅读并理解以上内容”
  2. 将此关键字“泵”放在“选择医疗设备”正下方的输入框中。
  3. 选中复选框“为“泵”找到的设备。
  4. 最后,按下搜索按钮

到目前为止我尝试过的脚本:

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://apps.tga.gov.au/Prod/devices/daen-entry.aspx')

driver.find_element_by_id('disclaimer-accept').click()
time.sleep(5)

driver.find_element_by_id('medicine-name').send_keys('pump')
time.sleep(8)

driver.find_element_by_id('medicines-header-text').click()

driver.find_element_by_id('submit-button').click()
time.sleep(7)

for item in driver.find_elements_by_xpath('//div[@class="table-responsive"]'):
    for tr_data in item.find_elements_by_xpath('.//tr'):
        td_data = tr_data.find_element_by_xpath('.//span[@class="hovertext"]//a')
        print(td_data.text)

driver.close()

【问题讨论】:

  • 能否分享一下 HTML 以便我验证逻辑?
  • 感谢您的回复,莫妮卡。我已经用指向 html 内容的链接更新了我的帖子。

标签: python selenium xpath web-scraping web-crawler


【解决方案1】:

你为什么不这样做:

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://apps.tga.gov.au/Prod/devices/daen-entry.aspx')

driver.find_element_by_id('disclaimer-accept').click()
time.sleep(5)

driver.find_element_by_id('medicine-name').send_keys('pump')
time.sleep(8)

driver.find_element_by_id('medicines-header-text').click()

driver.find_element_by_id('submit-button').click()
time.sleep(7)

for item in driver.find_elements_by_xpath(
'//table[@id]/tbody/tr/td[@class]/span[@class]/a[@id]'
):
    print(item.text)

driver.close()

输出:

27233
27283
27288
27289
27390
27413
27441
27520
25445
27816
27866
27970
28033
28238
26999
28264
28407
28448
28437
28509
28524
28553
28647
28677
28646

也许你想考虑用 driver.page_source 保存页面,拉出表格,保存为 html 文件。然后使用 html 中的 pandas 将表格打开到数据框中

【讨论】:

  • 这个 xpath 会给你所有的行:"""//body[@class]/div[@id]/div[@id]/div[@class]/div[@id ]/div[@class]/form[@id]/div[@id]/div[@class]/div[@id]/div/div[@class]/table[@id]/tbody/tr" ""
  • 感谢 James Schinner 提供的解决方案。我从来没有使用 selenium 处理表数据,这就是我搞砸脚本的原因。
  • 感谢 James Schinner 的回答。请在您的脚本中用 '//div[@class="table-responsive"]//td[@class="row-odd"]' 替换您的 xpath,以便我接受您的回答。您刚才提供的那个非常脆弱,如果对该网页进行任何类型的更改,它就会损坏。
  • 完成,虽然它给了我一个错误:selenium.common.exceptions.ElementNotVisibleException:消息:元素不可见(会话信息:chrome=59.0.3071.109)(驱动程序信息:chromedriver=2.30.477700( 0057494ad8732195794a7b32078424f92a5fce41),平台=Windows NT 10.0.15063 x86_64)
  • 恐怕我要离开它了。我很高兴它解决了你的问题
猜你喜欢
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多