如何使用python和lxml从html属性中获取未解析的实体

时间:2015-05-04 19:11:47

标签: python html python-2.7 lxml

使用python / lxml解析HTML时,我想检索html元素的实际属性文本,但我得到带有已解析实体的属性文本。也就是说,如果是实际属性 阅读this & that,我回来from lxml import etree s = '<html><body><a alt="hi &amp; 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 &amp; there">a link</a>'

有没有办法获得未解析的属性值? 下面是一些显示我的问题的示例代码,使用python2.7和lxml 3.2.1

hi &amp; there

我想获得实际的字符串{{1}}。

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 &amp; 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 &amp; there