Python中lxml库的xpath功能是否存在已知BUG?
最近在做网易云个人信息遍历抓取;
那么毛病就来了;
https://music.163.com/user/home?id=29879272
https://music.163.com/user/home?id=132128
这是两个个人主页; 29879272 这个呢,etree.HTML(源码),可以完全解析 html。
132128 这个呢,就 BUG 了,etree.HTML(源码),发现 html 被截断。


会被源码里面的 description 的 —— 双横线给截断了。简直奇葩;
有没有大神 look look。我发现这是一个 BUG
Python中lxml库的xpath功能是否存在已知BUG?
lxml 不要用 etree.HTML。换成
from lxml.html import fromstring
selector = fromstring(source)
selector.xpath(…)
关于lxml库的xpath功能是否存在已知BUG,我直接说结论:lxml的xpath实现总体稳定可靠,但确实存在一些边界情况下的已知问题。
lxml底层依赖libxml2的xpath引擎,这是经过多年实战检验的C语言库。绝大多数情况下,它的xpath功能是没问题的。不过,在一些特定场景下确实有已知问题:
-
命名空间处理:当处理带命名空间的XML时,如果没正确声明,xpath可能匹配不到节点。这不是bug,而是使用方式问题。
-
某些轴(axis)的边界情况:比如在非常复杂的文档中使用
following-sibling::*[position()>1]这类表达式时,可能会有预期外的结果。 -
大文档性能:虽然不算bug,但在处理超大XML时,某些复杂xpath可能导致内存使用较高。
实际开发中,我遇到xpath问题时会先做三件事:1)用简单xpath验证文档结构;2)检查命名空间;3)在浏览器开发者工具里先测试xpath(如果来源是网页)。
建议:遇到具体问题直接查libxml2的issue tracker更有效。
一样的。都会被那个双横线给截断掉。
>音乐人。不定义,不局限。 —\u0000 —\u0000 微博
被零字符截断了,替换掉就行
我是不是要先替换,才行。
selector = fromstring(source.replace(’\u0000’, ‘’))
之后正常使用
最近处理 PostgreSQl 数据库写入时也遇到过\u0000 不能解析,字符串中 replace 掉就好了
python 模块采用 c 编写导致,而\u0000 是 unicode 表示的一个特殊字符,,在 c 里面用这个字符作为字符串结束的标志。

