【问题标题】:Create List from path expression with Python使用 Python 从路径表达式创建列表
【发布时间】:2016-04-24 06:57:05
【问题描述】:

我目前正在开发一个没有任何框架的 webscraper,并且遇到了一个问题,即我测试 xpath xpression 以获取维基百科页面上的表格数据。但是,当我抓取它并将其打印到控制台时,它只返回一个空列表。有人可以请教吗?也许建议一些关于 xpath 的有用书籍进行网络抓取? (我有 safaribooks 有帮助)

import requests
from lxml import html

page = requests.get('https://en.wikipedia.org/wiki/L.A.P.D._(band)')
tree = html.fromstring(page.content)

# OK
bandName = tree.xpath('//*[@id="firstHeading"]/text()')
overview = tree.xpath('//*[@id="mw-content-text"]/p[1]//text()')
print(bandName)
print(overview)


#Trouble Code
yearsActive = tree.xpath('//*[@id="mw-content-text"]/table[1]/tbody/tr[6]//text()')
print(yearsActive)
members = tree.xpath('//*[@id="mw-content-text"]/table[1]/tbody/tr[11]/td[1]/ul/li/a//text()')
print(members)

更新: 在进行更多测试时,我发现 print(len(members)) 返回零,这似乎表明我的 xpath 表达式有问题,但是在 chrome 控制台中测试我的成员表达式时,它返回一个列表乐队成员。

【问题讨论】:

  • 您处理 HTML 而不是页面的实际数据是否有原因?
  • 我不确定如何“处理实际数据”。我对使用 xpath 和一般抓取非常陌生。您能否解释一下我如何处理实际数据?
  • yearsActivemembers 只是空的。你的意思是所有变量都是空的@user502301
  • @user502301 不,只有活跃年数和成员空着回来。其他两个变量正在起作用。我已经更新了我的代码提交,以便更好地从有效的代码中对无效的代码进行排序。
  • @Ignacio-Vazquez-Abrams 我不确定如何“处理实际数据”。我对使用 xpath 和一般抓取非常陌生。您能否解释一下我如何处理实际数据?

标签: python-2.7 xpath web-scraping


【解决方案1】:

您的 XPath 失败,因为原始 HTML 表没有tbody。在这种情况下,tbody 元素很可能是由浏览器生成的(请参阅下面的相关问题):

>>> yearsActive = tree.xpath('//*[@id="mw-content-text"]/table[1]/tr[6]/td/text()')
>>> print yearsActive
[u'1989\u20131992']
>>> members = tree.xpath('//*[@id="mw-content-text"]/table[1]/tr[10]/td[1]//text()[normalize-space()]')
>>> print members
['James Shaffer', 'Reginald Arvizu', 'David Silveria', '\nRichard Morrill', '\nPete Capra', '\nCorey (surname unknown)', '\nDerek Campbell', '\nTroy Sandoval', '\nJason Torres', '\nKevin Guariglia']

将来,检查您实际从requests.get() 收到的 HTML 通常很有用,以防您的 XPath 在从代码运行时意外失败,但在从浏览器工具运行时同样可以正常工作。

相关:Why does my XPath query (scraping HTML tables) only work in Firebug, but not the application I'm developing?

【讨论】:

  • 嘿@har07,你有什么特别的方法吗?感谢您的帮助!
  • 我没有特别推荐的网络抓取方法。我只是建议学习 XPath,我发现它足够强大,可以定位 HTML 的任何部分。
猜你喜欢
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 2022-01-02
  • 2020-03-17
  • 2019-01-04
相关资源
最近更新 更多