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

如何使用python和lxml从html属性中获取未解析的实体,python,html,python-2.7,lxml,Python,Html,Python 2.7,Lxml,在使用python/lxml解析HTML时,我希望检索HTML元素的实际属性文本,但我得到的是带有已解析实体的属性文本。也就是说,如果实际属性 读取此&;那,我回来了这&那 有没有办法获取未解析的属性值? 下面是一些示例代码,使用python2.7和lxml3.2.1说明了我的问题 from lxml import etree s = '<html><body><a alt="hi &amp; there">a link</a><

在使用python/lxml解析HTML时,我希望检索HTML元素的实际属性文本,但我得到的是带有已解析实体的属性文本。也就是说,如果实际属性 读取
此&;那
,我回来了
这&那

有没有办法获取未解析的属性值? 下面是一些示例代码,使用python2.7和lxml3.2.1说明了我的问题

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>'
从lxml导入etree
s=‘链接’
parser=etree.HTMLParser()
tree=etree.fromstring(s,parser=parser)
anc=tree.xpath('//a')
a=anc[0]
a、 get('alt')
“嗨&有”
a、 attrib.get('alt')
“嗨&有”
etree.tostring(a)
“链接”

我想得到实际的字符串
hi&;其中

未转义字符在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>

escape(a.attrib.get('alt'))我想要的是一种不被lxml改变的文本获取方法;cgi.escape将通过用实体替换符号来进行转义(例如),但即使它是unescape(用符号替换实体),我想要的是实际文本,因为它存在于通常未知的HTML源中。然后您需要构建一个自定义解析器。也许您可以继承HTMLParser并覆盖对所需文本位的解析。har07和@Will,谢谢——我不知道对未scaped字符的限制适用于属性和内容。我明白你们的意思,我会重新思考我原来的问题。escape似乎是回答我问题的唯一方法。您仍然可以构建自己的解析器。只需继承标准方法,并使用一些cgi.escape voodo重载所需的方法。
#..continuing the demo codes above:
print(t.xpath('//div')[0].text)
#hi & there
print(cgi.escape(t.xpath('//div')[0]).text)
#hi &amp; there