使用lxml解析HTML时如何保留名称空间信息?
>>> from lxml.etree import HTML, tostring
>>> tostring(HTML('<fb:like>'))
'<html><body><like/></body></html>'
请注意标记如何从
变为简单的
。
这使得处理将 XFBML 与 lxml 结合在一起的页面变得更加困难。 (
也会发生同样的情况)
任何帮助都会受到赞赏。
>>> from lxml.etree import HTML, tostring
>>> tostring(HTML('<fb:like>'))
'<html><body><like/></body></html>'
Note how the tag turns from <fb:like>
to simply <like>
.
This makes processing pages that incorporate XFBML with lxml much harder. (Same thing happens to <g:plusone></g:plusone>
)
Any help is appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
解决此问题的一种方法是修补 libxml2。
参考libxml2.9.2的源码(https://git.gnome.org/browse/libxml2/tree/?id=v2.9.2),在SAX2.c中(https://git.gnome.org/browse /libxml2/tree/SAX2.c?id=v2.9.2) (用于创建 DOM 树的内部 SAX 解析器)在第 1699 行,带有 xmlns 的属性在以下情况下不会被解析在 HTML 模式下,它们会像第 1740 行和第 1740 行中的任何其他属性一样进行解析。因此,调整第 1622 行是有意义的,该行将名称拆分为前缀和本地部分。改为:
然后
libxml2 会认为
等标签是针对名为o:p
的元素,即元素中包含冒号没有特殊含义的名字。这是 HTML 中的正确解释。例如,HTML5 规范表示:希望 libxml2 的未来版本能够批准这一更改。有一个开放的错误报告(https://bugzilla.gnome.org/show_bug.cgi?id=654146)。
One way to fix this issue is to patch libxml2.
Referring to the source code of libxml2.9.2 (https: //git.gnome.org/browse/libxml2/tree/?id=v2.9.2), in SAX2.c (https: //git.gnome.org/browse/libxml2/tree/SAX2.c?id=v2.9.2) (the internal SAX parser used to create the DOM tree) at line 1699 attributes with xmlns are not parsed when in HTML mode, and they are parsed like any other attributes at line and 1740. Consequently, it makes sense to adjust line 1622, which splits the name into prefix and local part. Change:
into
Then libxml2 will consider tags such as
<o:p>
to be for elements with nameo:p
, that is, the colon is included in the element name with no special meaning. This is the correct interpretation in HTML. For example, the HTML5 specification says:Hopefully this change will be approved for a future version of libxml2. There is an open bug report (https: //bugzilla.gnome.org/show_bug.cgi?id=654146).
尝试添加缺少的命名空间前缀定义。 lxml 将避免命名空间,据说是为了让您更轻松。
您尝试解析的站点很可能不包含这些命名空间定义,因此您应该添加它们。
像这样的东西: xmlns:adlcp="http:// /xxx/yy/zzz"
Try adding the namespace prefix definitions that are missing. lxml will avoid the namespaces otherwise, supposedly to make it easier for you.
Most likely the sites you try to parse will not contain these namespace definitions, so you should add them.
Something like this: xmlns:adlcp="http://xxx/yy/zzz"