import lxml.html as LH
import urllib2
url = 'http://espn.go.com/nba/team/roster/_/name/bos/boston-celtics'
doc = LH.parse(urllib2.urlopen(url))
print(doc.xpath('''
//div[@id="my-players-table"]/div//table[1]//tr/td[2]/a/text()''')[1:])
产量
['Brandon Bass', 'Avery Bradley', 'Jae Crowder', 'Jeff Green', 'Jameer Nelson',
'Kelly Olynyk', 'Phil Pressey', 'Marcus Smart', 'Jared Sullinger', 'Marcus
Thornton', 'Evan Turner', 'Gerald Wallace', 'Brandan Wright', 'James Young',
'Tyler Zeller']
在抓取页面时,首先要做的是直观地检查使用 urllib 或 requests 接收到的 HTML:
import urllib2
url = 'http://espn.go.com/nba/team/roster/_/name/bos/boston-celtics'
response = urllib2.urlopen(url)
with open('/tmp/test.html', 'wb') as f:
f.write(response.read())
有时 HTML 看起来与您在 GUI 浏览器中看到的不同,因为
urllib 或 requests 不处理 JavaScript。在这种情况下,其他工具,例如
作为硒,可能需要。但是,在这种情况下,文本搜索“Brandon
Bass" 显示可以在使用 urllib2 下载的 HTML 中访问数据:
<td class="sortcell"><a href="http://espn.go.com/nba/player/_/id/2745/brandon-bass">Brandon Bass</a></td>
使用您发布的 XPath 作为起点,
然后,您可以使用交互式 Python 会话来查找正确的 XPath:
In [80]: import lxml.html as LH
In [81]: import urllib2
In [82]: url = 'http://espn.go.com/nba/team/roster/_/name/bos/boston-celtics'
In [83]: doc = LH.parse(urllib2.urlopen(url))
In [84]: [LH.tostring(elt) for elt in doc.xpath('//div[@id="my-players-table"]/div//table/tr')]
Out[84]:
['<tr class="stathead"><td colspan="8">Team Roster</td></tr>',
'<tr class="colhead"><td><a href="http://espn.go.com/nba/team/roster/_/name/bos/sort/jersey/order/false/boston-celtics">NO.</a></td><td><a href="http://espn.go.com/nba/team/roster/_/name/bos/order/false/boston-celtics">NAME</a></td><td>POS</td><td><a href="http://espn.go.com/nba/team/roster/_/name/bos/sort/age/order/false/boston-celtics">AGE</a></td><td><a href="http://espn.go.com/nba/team/roster/_/name/bos/sort/height/order/false/boston-celtics">HT</a></td><td><a href="http://espn.go.com/nba/team/roster/_/name/bos/sort/weight/order/false/boston-celtics">WT</a></td><td>COLLEGE</td><td>2014-2015 SALARY</td></tr>',
In [86]: [elt.text_content() for elt in doc.xpath('//div[@id="my-players-table"]/div//table/tr/td')]
导致
//div[@id="my-players-table"]/div//table[1]//tr/td[2]/a/text()
(上面,我使用LH.tostring 函数来检查HTML sn-ps,并使用elt.text_content() 来检查各种元素中包含的文本。)
这是first tutorial 我为了理解 XPath 而阅读的。
一旦掌握了基础知识,您就可以开始阅读the XPath v1.0
specification。还有一个XPath
v2和XPath
v3,不过目前的lxml只支持XPath 1.0。
同时你可以阅读lxml docs,假设你使用的是lxml。
我还发现阅读Stackoverflow XPath questions,例如this one,很有帮助。
每次遇到新的功能或技术,我都会写一点
演示代码——一个最小的例子——展示(我自己)它是如何工作的。
这样,每当我需要再次执行 XYZ 时,我都可以从一些可运行的代码开始。