python - lxml.html 使用 XPath 和变量解析

标签 python html parsing web-scraping lxml

我有这个 HTML 片段

<div id="dw__toc">
<h3 class="toggle">Table of Contents</h3>
<div>

<ul class="toc">
<li class="level1"><div class="li"><a href="#section">#</a></div>
<ul class="toc">
<li class="level2"><div class="li"><a href="#link1">One</a></div></li>
<li class="level2"><div class="li"><a href="#link2">Two</a></div></li>
<li class="level2"><div class="li"><a href="#link3">Three</a></div></li>

现在我想用 lxml.html 解析它。最后我想要一个函数,我可以在其中提供一个搜索词(即“一个”)并且该函数应该返回

One
#link1

现在我正在尝试在 XPath 中获取一个变量。

作品:

import lxml.html
html = lxml.html.parse("www.myurl.com/slash/something")

test=html.xpath("//ul[@class='toc']/li[@class='level2']/div[@class='li']/a/text()='One'")

print test

尝试使用变量。我想用一个变量替换硬编码的 'One',稍后我可以将其返回给函数。

不起作用:

import lxml.html
html = lxml.html.parse("www.myurl.com/slash/something")

desiredvars = ['One']
myresultset=((var, html.xpath("//ul[@class='toc']/li[@class='level2']/div[@class='li']/a[text()='%s']"%(var))[0]) for var in desiredvars)

for each in myresultset: 
        print each

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
IndexError: list index out of range

这是基于这个答案:https://stackoverflow.com/a/10688235/2320453 知道为什么它不起作用吗?这是做这样的事情的“正确方法”吗?

编辑: 总结一下: 我想在 a-Tag 中搜索并从此属性中获取文本,但我不想要完整的列表,而是希望能够使用变量进行搜索。 伪代码:

import lxml.html
html = lxml.html.parse("www.myurl.com/slash/something")

searchterm = 'one'

test=html.xpath("...a/text()=searchterm")

print test

预期结果

One
#link1

最佳答案

您的第一个示例可行,但可能不是您认为的那样:

test=html.xpath("//ul[@class='toc']/li[@class='level2']/div[@class='li']/a/text()='One'")

返回的是一个 bool 值,如果 xpath 表达式左侧的结果集中的任何节点的条件 ...='One' 为真,则该 bool 值将为真.这就是您在第二个示例中出现错误的原因:True[0] 无效。

您可能希望所有节点都匹配表达式,并将 'One' 作为文本。相应的表达式为:

test=html.xpath("//ul[@class='toc']/li[@class='level2']/div[@class='li']/a[text()='One']")

这将返回一个节点集作为结果,或者如果您只需要 url 作为字符串:

test=html.xpath("//ul[@class='toc']/li[@class='level2']/div[@class='li']/a[text()='One']/@href")
# returns: ['#link1']

关于python - lxml.html 使用 XPath 和变量解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16285816/

相关文章:

python - 是否有等效于 Perls 'package' 关键字的 Python

python - 如何使用 Flask 从 python 调用应用程序路由

python - 在字典理解中使用 locals()

python - 如何在 django 中将字符串转换为本地化日期

html - 单个响应图像上的多个响应图像?

javascript - 服务器端的 onclick 事件 html 按钮

javascript - 无法使用 promise 命令 js 函数执行

c++ - 将转义的换行符视为行继续

javascript - 使用 PEG.js 解析完整的数学表达式

Java 文本阅读器