Python 3.x 如何使用Python和Beautiful Soup修复html列表片段中缺少的ul标记

Python 3.x 如何使用Python和Beautiful Soup修复html列表片段中缺少的ul标记,python-3.x,beautifulsoup,html-lists,Python 3.x,Beautifulsoup,Html Lists,如果我有这样一段html: <p><br><p> <li>stuff</li> <li>stuff</li> 东西 东西 有没有一种方法可以清理这个问题,并使用或其他python库添加缺少的ul/ol标记 我尝试了soup.prettify(),但它没有改变。首先,您必须决定要使用哪个解析器。不同的解析器处理格式错误的html 以下BeautifulSoup方法将帮助您完成所需的任务 -创建一个新的ul标

如果我有这样一段html:

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

  • 东西
  • 东西
  • 有没有一种方法可以清理这个问题,并使用或其他python库添加缺少的ul/ol标记


    我尝试了
    soup.prettify()
    ,但它没有改变。

    首先,您必须决定要使用哪个解析器。不同的解析器处理格式错误的html

    以下BeautifulSoup方法将帮助您完成所需的任务

    • -创建一个新的
      ul
      标签

    • -将新创建的ul标签附加到汤树中的某个位置

    • -逐个提取
      li
      标签(我们可以将其附加到
      ul
      标签)

    • -从树中删除任何不需要的标记。这可能是解析器对格式错误的html进行解释的结果

    我的解决方案

    让我们使用
    html5lib
    解析器创建一个soup对象,看看我们得到了什么

    from bs4 import BeautifulSoup
    html="""
    <p><br><p>
    <li>stuff</li>
    <li>stuff</li>
    """
    soup=BeautifulSoup(html,'html5lib')
    print(soup)
    
    产出:

    <html><head></head><body><p><br/></p><p>
    </p><li>stuff</li>
    <li>stuff</li>
    </body></html>
    
    <html>
     <head>
     </head>
     <body>
      <p>
       <br/>
      </p>
      <ul>
       <li>
        stuff
       </li>
       <li>
        stuff
       </li>
      </ul>
     </body>
    </html>
    
    
    
    

    • 东西
    • 东西

    似乎没有一种内置方法将
    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())
    
    从bs4导入美化组
    soup=BeautifulSoup(html,“html.parser”)
    ulgroup=0
    uls=[]
    给汤里的李。芬德尔(‘李’):
    previous_元素=li.findPrevious()
    #如果
  • 已包装在
      中,请不要执行任何操作 如果前一个_元素和前一个_元素.name=='ul': 继续 #如果
    • 组的第一个元素,则用新的
        如果不是上一个元素或上一个元素.name!='李': ulgroup+=1 ul=汤。新标签(“ul”) 包装纸(ul) 附加uls(ul) #将
      • 组的其余部分附加到先前创建的
          elif ulgroup>0: uls[ulgroup-1]。追加(li) 打印(soup.prettify())
  • 例如,以下输入:

    html = '''
    <p><br><p>
    <li>stuff1</li>
    <li>stuff2</li>
    <div></div>
    <li>stuff3</li>
    <li>stuff4</li>
    <li>stuff5</li>
    '''
    
    html=''
    
  • 材料1
  • 材料2
  • 物品3
  • 物品4
  • 物品5
  • '''
    产出:

    <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>
    
    
    
    • 材料1
    • 材料2
    • 物品3
    • 物品4
    • 物品5


    演示:

    如果第一个元素是
  • <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>