使用BeautifulSoup提取非层级结构的连续HTML元素
提取无结构巨型div中的重复模式内容
这种没有层级结构的巨型div确实挺让人头疼的,但我们可以通过手动遍历DOM节点、匹配目标序列的方式来提取你要的h4 p ul (strong ul)模式实例。下面是具体的实现思路和代码:
核心思路
- 先定位到那个巨型div,过滤掉其中的文本、注释等非元素节点,只保留我们需要的标签节点
- 遍历节点列表,以
h4作为模式的起点,依次匹配后续的p、ul,再处理可重复出现的strong + ul组合 - 每匹配到一个完整的模式实例,就把它整理成结构化的数据保存下来
JavaScript实现代码
// 获取目标巨型div(如果有特定类名/ID可以替换成更精准的选择器) const giantDiv = document.querySelector('div'); // 过滤出所有元素节点,排除文本、注释等干扰节点 const elementNodes = Array.from(giantDiv.childNodes).filter(node => node.nodeType === Node.ELEMENT_NODE); // 存储提取到的所有模式实例 const extractedGroups = []; let currentIndex = 0; while (currentIndex < elementNodes.length) { const currentNode = elementNodes[currentIndex]; // 找到h4作为模式的起始点 if (currentNode.tagName === 'H4') { const group = { h4Content: currentNode.textContent.trim(), pContent: '', mainUlItems: [], strongUlPairs: [] }; currentIndex++; // 匹配紧跟的p标签 if (currentIndex < elementNodes.length && elementNodes[currentIndex].tagName === 'P') { group.pContent = elementNodes[currentIndex].textContent.trim(); currentIndex++; // 匹配紧跟的ul标签 if (currentIndex < elementNodes.length && elementNodes[currentIndex].tagName === 'UL') { // 提取ul下的所有li文本 group.mainUlItems = Array.from(elementNodes[currentIndex].querySelectorAll('li')) .map(li => li.textContent.trim()); currentIndex++; // 循环匹配重复出现的strong + ul组合 while (currentIndex < elementNodes.length && elementNodes[currentIndex].tagName === 'STRONG') { const strongText = elementNodes[currentIndex].textContent.trim(); currentIndex++; // 确保strong后面紧跟ul if (currentIndex < elementNodes.length && elementNodes[currentIndex].tagName === 'UL') { const ulItems = Array.from(elementNodes[currentIndex].querySelectorAll('li')) .map(li => li.textContent.trim()); group.strongUlPairs.push({ strong: strongText, ulItems }); currentIndex++; } else { // 如果strong后没有ul,终止当前组合的匹配 break; } } // 将完整匹配的模式实例加入结果数组 extractedGroups.push(group); continue; } } } // 如果当前节点不是h4,或者模式匹配中断,继续遍历下一个节点 currentIndex++; } // 输出提取结果,你可以根据需求进一步处理这些数据 console.log('提取到的模式实例:', extractedGroups);
补充说明
- 代码中过滤了非元素节点,所以节点间的换行、空格等文本不会干扰匹配
- 如果你的模式中
h4和后续标签之间可能夹杂少量无关元素,可以修改逻辑,比如在寻找下一个目标标签时跳过无关节点(比如增加一个循环跳过非目标标签) - 提取后的结果是结构化的数组,每个元素对应一个完整的
h4 p ul (strong ul)实例,方便你后续处理或展示
内容的提问来源于stack exchange,提问作者Daniel Paczuski Bak
相关产品推荐
相关产品推荐

