LXML ElementTree解析XML时STYLE元素无法生成子节点树问题
问题根源:HTML解析器误用在XML上
哦,这个坑我见过好多次了!你现在的问题完全是因为用HTML解析器处理XML文档导致的。lxml.html.fromstring()是专门为HTML设计的,它会遵循HTML的规则来解析内容:在HTML里,<style>标签的内容会被当作纯文本(比如CSS代码),不会被解析成嵌套的节点结构。这就是为什么你的<STYLE>元素下的子节点没有被构建,所有内容都变成了该元素的文本值。
修复方案:切换到XML解析器
直接用lxml.etree的解析器来处理XML文档,它会严格遵循XML的规则解析嵌套元素。修改后的代码如下:
import requests import lxml.etree response = requests.get('http://www.beerxml.com/recipes.xml') def depth(node): d = 0 while node is not None: d += 1 node = node.getparent() return d # 用XML解析器解析XML内容 tree = lxml.etree.fromstring(response.content) for recipe in tree: for child in recipe.iter(): # 可选:把标签转成小写,和你期望的输出格式一致 tag = child.tag.lower() # 处理文本为空的情况,避免输出None text = child.text.strip() if child.text else '' print(depth(child), tag, '\t\t\t', text)
额外小贴士
- XML是大小写敏感的,HTML则不是。
lxml.html会自动把标签转成小写,但lxml.etree会保留原始大小写,所以上面的代码里加了tag.lower()来匹配你期望的输出格式。 - 如果后续遇到带命名空间的XML文档,可以在解析或遍历的时候指定命名空间参数,不过这个示例里的文档没有命名空间,所以不用额外处理。
- 记住:HTML和XML的解析规则差异很大,处理对应格式的文档一定要用对应的解析器,不然很容易出现这种“看起来应该正常但就是解析异常”的问题。
内容的提问来源于stack exchange,提问作者Jelle O
相关产品推荐
相关产品推荐

