【问题标题】:how to get unresolved entities from html attributes using python and lxml如何使用python和lxml从html属性中获取未解析的实体
【发布时间】:2015-05-04 19:11:46
【问题描述】:

当使用 python/lxml 解析 HTML 时,我想检索 html 元素的实际属性文本,但相反,我得到了带有已解析实体的属性文本。也就是说,如果实际属性 读取this & that,我回复this & that

有没有办法获取未解析的属性值? 这是一些显示我的问题的示例代码,使用 python2.7 和 lxml 3.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>'

我想得到实际的字符串hi &amp;amp; there

【问题讨论】:

  • cgi.escape(a.attrib.get('alt'))
  • 我想要的是一种让 lxml 不改变文本的方法; cgi.escape 将通过用实体替换 & 来转义(例如),但即使它是 unescape(用 & 替换实体),我想要的是实际文本,因为它存在于通常未知的 HTML 源中。
  • 你需要构建一个自定义解析器。也许您可以继承 HTMLParser 并覆盖您想要的文本位的解析。

标签: python html python-2.7 lxml


【解决方案1】:

未转义字符在 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 源的信息,而是保留固定有效的信息。所以此时,我们只能看到所有字符都被转义了。

话虽如此,使用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

【讨论】:

  • har07 和@Will,谢谢——我不知道对非转义字符的限制适用于属性和内容。我明白你们俩在说什么,我会重新考虑我原来的问题。 cgi.escape 似乎是回答我问题的唯一方法。
  • 您仍然可以构建自己的解析器。只需继承标准的方法,并使用一些 cgi.escape voodoo 重载您需要的方法。
猜你喜欢
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 2015-01-20
  • 2013-01-17
相关资源
最近更新 更多