python-3.x - 如何使用 Python 和 Beautiful Soup 修复 html 列表片段中丢失的 ul 标签

标签 python-3.x beautifulsoup html-lists

如果我有这样的 html 片段:

<p><br><p>
<li>stuff</li>
<li>stuff</li>

有没有办法清理这个并使用 beautiful soup 添加缺少的 ul/ol 标签,或另一个Python库?

我尝试了 soup.prettify() 但它保持原样。

最佳答案

似乎没有一个内置方法可以将 li 元素组包装到 ul 中。但是,您可以简单地循环 li 元素,识别每个 li 组的第一个元素并将其包装在 ul 标记中。该组中的下一个元素将附加到之前创建的 ul 中:

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, "html.parser")

ulgroup = 0
uls = []
for li in soup.findAll('li'):
        previous_element = li.findPrevious()
        # if <li> already wrapped in <ul>, do nothing
        if previous_element and previous_element.name == 'ul': 
            continue 
        # if <li> is the first element of a <li> group, wrap it in a new <ul>
        if not previous_element or previous_element.name != 'li':
            ulgroup += 1
            ul = soup.new_tag("ul")
            li.wrap(ul)
            uls.append(ul)
        # append rest of <li> group to previously created <ul>
        elif ulgroup > 0:
            uls[ulgroup-1].append(li)

print(soup.prettify())

例如,输入以下内容:

html = '''
<p><br><p>
<li>stuff1</li>
<li>stuff2</li>
<div></div>
<li>stuff3</li>
<li>stuff4</li>
<li>stuff5</li>
'''

输出:

<p>
 <br/>
 <p>
  <ul>
   <li>
    stuff1
   </li>
   <li>
    stuff2
   </li>
  </ul>
  <div>
  </div>
  <ul>
   <li>
    stuff3
   </li>
   <li>
    stuff4
   </li>
   <li>
    stuff5
   </li>
  </ul>
 </p>
</p>

演示:https://repl.it/@glhr/55619920-fixing-uls

关于python-3.x - 如何使用 Python 和 Beautiful Soup 修复 html 列表片段中丢失的 ul 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55619920/

相关文章:

python - 从文件中的数据组成的列表中删除字符

python-3.x - 在某些条件下使用计数方法重新采样数据帧

python - 使用 BeautifulSoup 检查列表中的字符串是否存在于 HTML 中

python - 抓取 Facebook 点赞

jquery获取悬停的li的索引

python - 如何制作接受元组输入的Python函数?

python-3.x - 如何在 Python 中从 html 中抓取无序列表?

python-3.x - 如何从网页的图形中提取数据?

jquery - 扩展一个元素来填充 li

javascript - 来自 UL LI 的 JQuery Autocomplete(作为源代码)