lxml中子元素的文本值的XPath

时间:2014-12-16 11:57:00

标签: python html xpath lxml elementtree

首先,是否可以做这样的事情?

我一直在尝试使用"子元素文本值生成Xpath表达式"出现在网页上。尝试使用Python中的lxml(etree,html,getpath),ElementTree模块来完成此操作。但我不知道如何为网页中存在的值生成Xpath表达式。我完全了解python中的Scrapy框架,但这是不同的。

以下是我不完整的代码..

import urllib2, re
from lxml import etree

def wgetUrl(target):
    try:
        req = urllib2.Request(target)
        req.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3 Gecko/2008092417 Firefox/3.0.3')
        response = urllib2.urlopen(req)
        outtxt = response.read()
        response.close()
    except:
        return ''
    return outtxt


newUrl = 'http://www.iupui.edu/~webtrain/tutorials/tables.html' # homepage

dt = wgetUrl(newUrl)
parser = etree.HTMLParser()
tree   = etree.fromstring(dt, parser)

根据lxml documentation他们手动创建元素树,但是如何使用我的读取和解析的html数据(在我的示例变量treedata中)来访问子-元件。 或者更重要的是,如果可能的话,子元素文本值。

让我们在上面的示例网页中说,我想搜索表"耗材和费用" 并通过值动态生成Xpath表达式 - 耗材和费用

有没有选择这样做!最终目标,我想实现的是阅读网页,并为网页中的子元素文本值生成Xpath。

1 个答案:

答案 0 :(得分:2)

根据文本值的一部分查找所有元素:

"//*[contains(text(), 'some_value')]"

例如,如果你有这个:

<div id="somediv">
    <span>Something is here</span>
    <a href="#">Click here</a>
</div>

你可以找到包含单词&#34; here&#34;的所有子元素。像这样:

"//div[@id='somediv']//*[contains(text(), 'here')]"

或者,您可以查找包含单词&#34; Something&#34;的所有sub-div span元素:

"//div[@id='somediv']//span[contains(text(), 'Something')]"

至于在lxml中解析它:

from lxml import etree
outtxt = response.read()
root = etree.fromstring(outtxt)
root.xpath("my_xpath_expression")

更新:

要获取元素的完整XPath表达式,请使用ElementTree.getPath()方法,如下所示:

tree = etree.ElementTree(root)
# this will print XPath of all
# elements in 'root'
for e in root.iter():
    print tree.getpath(e)