我正在使用lxml的xpath函数来检索网页的各个部分。我正在尝试获取<font>
标记的内容,其中包含自己的html标记。如果我使用
//td[@valign="top"]/p[1]/font[@face="verdana" and @color="#ffffff" and @size="2"]
我获得了正确数量的节点,但它们作为lxml对象返回(<Element font at 0x101fe5eb0>
)。
如果我使用
//td[@valign="top"]/p[1]/font[@face="verdana" and @color="#ffffff" and @size="2"]/text()
我得到了我想要的,除了我没有得到<font>
节点中包含的任何HTML代码。
如果我使用
//td[@valign="top"]/p[1]/font[@face="verdana" and @color="#ffffff" and @size="2"]/node()
如果得到文本和lxml元素的混合! (例如something something <Element a at 0x102ac2140> something
)
无论如何使用纯XPath查询来获取<font>
节点的内容,甚至强制lxml从.xpath()
方法返回内容字符串,而不是lxml对象
请注意,我正在从XPath查询返回许多节点的列表,因此解决方案需要支持该节点。
只是为了澄清......我想从{...}中回复something something <a href="url">inside</a> something
<font face="verdana" color="#ffffff" size="2"><a href="url">inside</a> something</font>
答案 0 :(得分:2)
无论如何都要使用纯XPath 查询获取的内容
<font>
个节点,甚至强制lxml 返回一串内容 而是来自.xpath()
方法 而不是一个lxml对象?请注意,我正在返回许多列表 来自XPath查询的节点所以 解决方案需要支持。
只是为了澄清......我想回来 来自
<a href="url">inside</a> something
的东西 类似......<font face="verdana" color="#ffffff" size="2"><a
href =“url”&gt;内容
简短回答:否。
XPath不适用于“标记”,但使用节点
所选节点表示为托管XPath的语言中特定对象的实例。
如果您需要特定节点标记的字符串表示,此类对象通常支持outerXML
属性 - 请检查托管语言的文档(在本例中为lxml)。
正如@ Robert-Rossney在评论中指出的那样:lxml的tostring()
方法等同于其他环境'outerXml
属性。
答案 1 :(得分:2)
我不确定我理解 - 这是否与你想要的一致?
import lxml.etree as le
import cStringIO
content='''\
<font face="verdana" color="#ffffff" size="2"><a href="url">inside</a> something</font>
'''
doc=le.parse(cStringIO.StringIO(content))
xpath='//font[@face="verdana" and @color="#ffffff" and @size="2"]/child::*'
x=doc.xpath(xpath)
print(map(le.tostring,x))
# ['<a href="url">inside</a> something']