使用python / lxml解析HTML时,我想检索html元素的实际属性文本,但我得到带有已解析实体的属性文本。也就是说,如果是实际属性
阅读this & that
,我回来from lxml import etree
s = '<html><body><a alt="hi & there">a link</a></body></html>'
parser = etree.HTMLParser()
tree = etree.fromstring(s, parser=parser)
anc = tree.xpath('//a')
a = anc[0]
a.get('alt')
'hi & there'
a.attrib.get('alt')
'hi & there'
etree.tostring(a)
'<a alt="hi & there">a link</a>'
。
有没有办法获得未解析的属性值? 下面是一些显示我的问题的示例代码,使用python2.7和lxml 3.2.1
hi & there
我想获得实际的字符串{{1}}。
答案 0 :(得分:2)
非转义字符在HTML中无效,HTML抽象模型(本例中为lxml.etree
)仅适用于有效的HTML。因此,在将源HTML加载到对象模型之后,没有未转义字符的概念。
鉴于HTML源中未转义的字符,解析器将完全失败,或尝试自动修复源。 lxml.etree.HTMLParser
似乎属于后一类。对于演示:
s = '<div>hi & there</div>'
parser = etree.HTMLParser()
t = etree.fromstring(s, parser=parser)
print(etree.tostring(t.xpath('//div')[0]))
#the source is automatially escaped. output:
#<div>hi & there</div>
而我相信,HTML树模型不会保留有关原始HTML源的信息,而是保留了固定有效的HTML源。所以在这一点上,我们只能看到所有字符都被转义。
话虽如此,如何使用cgi.escape()
获取转义的实体! :P
#..continuing the demo codes above:
print(t.xpath('//div')[0].text)
#hi & there
print(cgi.escape(t.xpath('//div')[0]).text)
#hi & there