【问题标题】:Wrap multiple list items in a new tag ('ul'/'ol') using Beautiful Soup?使用 Beautiful Soup 将多个列表项包装在新标签 ('ul'/'ol') 中?
【发布时间】:2019-11-25 14:18:34
【问题描述】:

希望这很简单——我有几个段落。使用 Beautiful Soup,我正在使用 link.parent.name = 'li' 将它们转换为列表,但如果有人能告诉我如何将整个创建的多个 li 标签列表包装在新的 <ul> </ul> 标签中,我将不胜感激。

由于给定页面上将有多个单独的列表,因此我希望能够选择所有兄弟姐妹并将它们全部包装在新标签中。

所以

<li>1</li>
<li>1</li>
<li>1</li>

<li>2</li>
<li>2</li>
<li>2</li>

<li>3</li>
<li>3</li>
<li>3</li>

看起来像

<ul>
<li>1</li>
<li>1</li>
<li>1</li>
</ul>

<ul>
<li>2</li>
<li>2</li>
<li>2</li>
</ul>

<ul>
<li>3</li>
<li>3</li>
<li>3</li>
</ul>

感谢您的帮助。

【问题讨论】:

  • 你不能使用普通的 for-loop 并将其添加为普通文本 - 不使用 BeautifulSoup 吗?您所拥有的只是一个字符串,因此使用字符串函数可能会更简单。最后,如果你想生成 HTML 文件,你可以使用 Jinja2 创建模板,该模板也可以使用 for-loops 并且它适用于字符串。
  • 顺便说一句:使用BeautifulSoup 我会先创建&lt;ul&gt;,然后在这个&lt;ul&gt; 中放入3 个&lt;li&gt;,然后我会为其他&lt;ul&gt; 重复它。所以它需要for-loop。

标签: python html list beautifulsoup


【解决方案1】:
from bs4 import BeautifulSoup

htmlText = '''
<li>1</li>
<li>1</li>
<li>1</li>

<li>2</li>
<li>2</li>
<li>2</li>

<li>3</li>
<li>3</li>
<li>3</li>
'''

paragraphs = htmlText.split('\n\n')   # splits paragraph whenever there is an empty new line

for paragraph in paragraphs:

    soup = BeautifulSoup(paragraph)
    lis = soup.find_all('li')
    ul = soup.new_tag('ul')

    for li in lis:
        ul.append(li)

    print(ul)

返回:

<ul><li>1</li><li>1</li><li>1</li></ul>
<ul><li>2</li><li>2</li><li>2</li></ul>
<ul><li>3</li><li>3</li><li>3</li></ul>

最重要的部分是定义paragraphs 变量。

【讨论】:

  • 感谢您的回复,这很有趣 - 我实际上正在为不同的输入文件制作插件,因此我无法准确定义段落变量。有没有办法只搜索列表项的所有兄弟姐妹并将其包装在 ul 中?非常感谢。
  • 是的,您可以find siblings 然后以与上述相同的方式附加到新的ul。您可能只需找到第一个 li,然后从那里找到下一个兄弟姐妹。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 2018-10-23
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多