Python 新手,特别是 xpath - 尝试将字符串列表抓取到 Python 列表中。我明白我想做什么,但不知道该怎么写。我正在尝试从 ESPN 的球队名单页面中提取球员姓名:
我知道我的代码看起来像这样,因为有一个表,我想要提取的每个条目都有这个 xpath(取自 Chrome) - 我相信 a 要么指向链接,要么指向链接的文本,链接到。
//*[@id="my-players-table"]/div[2]/div/table[1]/tbody/tr[3]/td[2]/a
对于我的问题,当右侧的 tr 元素递增时,会更改玩家名称 <--- 与我的问题相关,因为这是我最终寻求的数据。
For EachRow in Table:
If ChildElement exists:
Add Child Element to List
Else: nextrow
现在我只需将 EachRow
替换为 //*[@id="my-players-table"]/div[2]/div/table[1]/tbody/tr[i]
和 ChildElement
与 //*[@id="my-players-table"]/div[2]/div/table[1]/tbody/tr[i]/td[2]/a
?
还有人有一个好的博客或学习帖子,我可以在其中掌握 Xpath 或更具体地说,在与 Python 一起使用时掌握 Xpath 吗?我想知道是否要阅读文档,因为我不确定他们是否有相关示例,但如果有,我很乐意看一下。
谢谢大家,圣诞快乐
顺便说一句:我试图剖析的链接 http://espn.go.com/nba/team/roster/_/name/bos/boston-celtics
最佳答案
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。在这种情况下,其他工具,例如 可能需要 Selenium 。然而,在这种情况下,文本搜索“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 session 来查找正确的 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 片段,并使用 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 操作时,我都可以从一些可运行的代码开始。
关于python - Python 的 XPath 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27647973/