首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有lxml.html和变量的XPath解析

带有lxml.html和变量的XPath解析
EN

Stack Overflow用户
提问于 2013-04-29 18:36:39
回答 2查看 25.8K关注 0票数 8

我有这个HTML片段

代码语言:javascript
复制
<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解析它。最后,我想要一个函数,在那里我可以提供一个搜索项(即“1”),并且函数应该返回。

代码语言:javascript
复制
One
#link1

现在,我正试图在XPath中得到一个变量。

Works:

代码语言:javascript
复制
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',稍后可以返回函数。

不工作:

代码语言:javascript
复制
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标记中搜索并从这个属性中获取文本,但是我不想要一个完整的列表,而是希望能够使用一个变量进行搜索。伪码:

代码语言:javascript
复制
import lxml.html
html = lxml.html.parse("www.myurl.com/slash/something")

searchterm = 'one'

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

print test

预期结果

代码语言:javascript
复制
One
#link1
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-29 19:22:12

你的第一个例子行得通,但可能不是你所认为的那样:

代码语言:javascript
复制
test=html.xpath("//ul[@class='toc']/li[@class='level2']/div[@class='li']/a/text()='One'")

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

您可能希望所有节点都与expession相匹配,并将'One'作为文本。相应的表述如下:

代码语言:javascript
复制
test=html.xpath("//ul[@class='toc']/li[@class='level2']/div[@class='li']/a[text()='One']")

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

代码语言:javascript
复制
test=html.xpath("//ul[@class='toc']/li[@class='level2']/div[@class='li']/a[text()='One']/@href")
# returns: ['#link1']
票数 6
EN

Stack Overflow用户

发布于 2013-07-19 16:04:06

我试过马塔的回答,但对我来说没有用:

代码语言:javascript
复制
div_name = 'foo'
my_div = x.xpath(".//div[@id=%s]" %div_name)[0]

我在他们的网站http://lxml.de/xpathxslt.html#the-xpath-method上找到了这些可能有同样问题的人:

代码语言:javascript
复制
div_name = 'foo'
my_div = x.xpath(".//div[@id=$name]", name=div_name)[0]
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16285816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档