python - 使用 Python 解析嵌套的 HTML 列表

标签 python html parsing beautifulsoup

我的 HTML 代码包含这样的嵌套列表:

<ul>
  <li>Apple</li>
  <li>Pear</li>
  <ul>
     <li>Cherry</li>
     <li>Orange</li>
     <ul>
        <li>Pineapple</li>
     </ul>
  </ul>
  <li>Banana</li>
</ul>

我需要解析它们,使它们看起来像这样:

+ Apple
+ Pear
++ Cherry
++ Orange
+++ Pineapple
+ Banana

我尝试使用 BeautifulSoup,但我对如何在我的代码中考虑嵌套感到困惑。

示例,其中 x 包含上面列出的 HTML 代码:

import bs4

soup = bs4.BeautifulSoup(x, "html.parser")
for ul in soup.find_all("ul"):
    for li in ul.find_all("li"):
        li.replace_with("+ {}\n".format(li.text))

最佳答案

你可以使用递归:

import bs4, re
from bs4 import BeautifulSoup as soup
s = """
<ul>
  <li>Apple</li>
  <li>Pear</li>
  <ul>
     <li>Cherry</li>
     <li>Orange</li>
     <ul>
        <li>Pineapple</li>
     </ul>
  </ul>
  <li>Banana</li>
</ul>
"""
def indent(d, c = 0):
   if (s:=''.join(i for i in d.contents if isinstance(i, bs4.NavigableString) and i.strip())):
       yield f'{"+"*c} {s}'
   for i in d.contents:
      if not isinstance(i, bs4.NavigableString):
         yield from indent(i, c+1)

print('\n'.join(indent(soup(s, 'html.parser').ul)))

输出:

+ Apple
+ Pear
++ Cherry
++ Orange
+++ Pineapple
+ Banana

关于python - 使用 Python 解析嵌套的 HTML 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69930370/

相关文章:

python - 属性错误 : 'NoneType' object has no attribute 'time' paramiko

python - 一维数组或列表的隔离森林 Sklearn 以及如何调整超参数

html - DIV神秘向下移动

javascript - 单击相应的 "item"时编辑 "btn"的 css

javascript - 在javascript中拆分字符串

java - 如何从 AutoCAD 创建的 DXF 中提取组件?

python - H2O Python API : retrieve best models from GridSearch

python - 在 django-crispy-forms PrendedText 字段中禁用自动完成

jquery - 背景图像如何适合单元格表(允许扭曲)

php - str_getcsv() 不忽略引用的新行