使用Python从路径表达式创建列表

时间:2016-04-24 06:57:06

标签: python-2.7 xpath web-scraping

我目前正在开发一个没有任何框架的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控制台中测试我的成员表达式时,它返回一个乐队成员名单。

1 个答案:

答案 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在从代码运行时意外失败但从浏览器工具运行时效果正常。

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