我正在尝试使用Python lxml
库来解析网页。在Firefox的开发人员视图中,页面的树形结构清晰地显示为:
但是,当我在Python中运行此查询时:
>>> spellTree.xpath('//span[@id="ctl00_MainContent_DetailedOutput"]/child::node()')
[<Element h1 at 0x445a4b0>]`
它只将h1
元素视为span
的子元素,而不是其他spans
或h1
之后的任何其他节点,即使树清楚地显示它们是子节点。
它确实标识了文档中存在的其他跨度:
>>> spellTree.xpath('//span[@class="trait"]//child::node()')
[<Element a at 0x445a570>, 'Acid', <Element a at 0x445a5a0>, 'Attack', <Element a at 0x445a600>, 'Cantrip', <Element a at 0x445a5d0>, 'Evocation']
但是它不会注册它们是DetailedOutput
跨度的子节点。是我的XPath错了,还是这是一个bug或异常?
编辑: Python 3.7.3,lxml 4.5.1。
发布于 2020-07-08 03:27:58
它可能是格式错误的html。
看起来//span[@id="ctl00_MainContent_DetailedOutput"]
不是//span[@class="trait"]
的孩子;相反,他们看起来像兄弟姐妹。这就是为什么//span[@id="ctl00_MainContent_DetailedOutput"]//child::node()
只显示4个子节点。
这可能是原因:在span[@id="ctl00_MainContent_DetailedOutput"]
标记中似乎有一个零散的</span>
;这可能会导致html解析器认为span[@id="ctl00_MainContent_DetailedOutput"]
是封闭的,从而导致将下一个跨度(//span[@id="ctl00_MainContent_DetailedOutput"]
)视为其兄弟而不是其子级。
https://stackoverflow.com/questions/62780903
复制相似问题