使用BeautifulSoup遍历ol标签所有子元素并保持顺序的方法
问题根因
HTML规范明确要求,<ol>有序列表的合法直接子元素仅支持<li>列表项、<script>、<template>这类标签,不允许直接嵌套<div>。你用的HTML解析器默认会对不符合规范的DOM做容错修正,自动把夹在两个<li>中间的<div>移出<ol>的子节点层级,挪到<ol>标签外面,所以遍历ol的子元素时拿不到这个div。
解决方法
方案1(推荐):修正HTML结构
把<div>放到对应的<li>标签内部,写出符合规范的HTML,从根源上避免解析器自动修改结构,也能保证所有浏览器、解析器的渲染结果一致。
合法结构示例:<ol> <li>...</li> <li> <div>...</div> </li> <li>...</li> </ol>方案2:更换解析器保留原始结构
如果你没法修改原始HTML,可以把解析器换成html5lib,这个解析器会最大程度保留原始HTML的节点位置,不会随便挪动不符合规范的节点。
初始化代码示例(需要先执行pip install html5lib安装依赖):from bs4 import BeautifulSoup doc = BeautifulSoup(原始HTML字符串, 'html5lib')换完解析器后,原有遍历代码就能按顺序拿到
<ol>下的所有子元素,包括中间的<div>。遍历时建议加节点判断,过滤掉代码缩进、换行生成的空白文本节点,避免输出无意义空内容:for e in doc.find('ol').children: if e.name: # 跳过空白文本节点 print(e.text)
内容的提问来源于stack exchange,提问作者Sven
相关产品推荐
相关产品推荐

