我目前正在开发一个没有任何框架的webscraper,并遇到一个问题,我测试xpath xpression,比如在wikipedia页面上获取表数据。但是,当我刮擦它并将其打印到控制台时,它只返回一个空列表。任何人都可以建议吗?或许可以在xpath上为webscraping推荐一些有用的书籍? (我有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控制台中测试我的成员表达式时,它返回一个乐队成员名单。
答案 0 :(得分: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在从代码运行时意外失败但从浏览器工具运行时效果正常。