gpt4 book ai didi

python - Python 的 XPath 语法

转载 作者:行者123 更新时间:2023-12-01 04:54:57 26 4
gpt4 key购买 nike

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 。然而,在这种情况下,文本搜索“BrandonBass”显示可以在使用 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.0specification 。还有一个XPathv2XPathv3 ,但当前lxml仅支持XPath 1.0。

同时您可以阅读lxml docs ,假设您使用的是 lxml。

我还发现阅读Stackoverflow XPath questions ,如this one ,有帮助。

每次遇到新的功能或技术,我都会写一些演示代码——一个最小的例子——展示(我自己)它是如何工作的。这样,每当我需要再次执行 XYZ 操作时,我都可以从一些可运行的代码开始。

关于python - Python 的 XPath 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27647973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com