从格式错误的HTML获取列表数据

2024-03-29 06:57:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从列表数据格式不正确的<UL>获取数据。换句话说,列表中缺少结束标记(</LI>):

<UL>
    <LI>Blah2
    <LI><A>Blah</A>
    <LI><A>Blah2</A>
</UL>

<UL>
    <LI><A>Blah</A>
    <LI>Blah2
    <LI><A>Blah2</A>
</UL>

<UL>
    <LI><A>Blah</A>
</UL>

<UL>
    <LI>Blah
</UL>

我能重复一下吗?如示例所示,可以有链接和无链接的混合。最重要的是我获取链接(如果有的话)和文本。你知道吗

不幸的是,BeutifulSoup试图修复格式错误的HTML,并造成比需要更多的损坏:

from bs4 import BeautifulSoup as bsoup
html = '<UL><LI>Blah><LI><A>Blah</A><LI><A>Blah2</A></UL>'
print bsoup(html).prettify()
>>> <ul>
>>>  <li>
>>>   Blah&gt;
>>>   <li>
>>>    <a>
>>>     Blah
>>>    </a>
>>>    <li>
>>>     <a>
>>>      Blah2
>>>     </a>
>>>    </li>
>>>   </li>
>>>  </li>
>>> </ul>

如上面的示例所示,Bsoup将所有结束标记添加到列表项的末尾。你知道吗


Tags: 标记文本示例列表链接htmlliul
2条回答

根据我的评论,BS4 handles invalid HTML differently depending on which parser you usefour parsers that are supported是:

  • 你知道吗html.parser语法分析器(内置)
  • lxml的HTML解析器
  • lxml的XML解析器
  • html5lib(在本例中有效)

您可以使用试错法,或者具体查看您的问题以及每个解析器处理问题的方式(使用上面的链接),然后选择一个按照您希望的方式运行的解析器。你知道吗

如果没有嵌套列表项,可以使用正则表达式手动关闭<li>标记:

>>> xhtml = re.sub(r'\<li\>(.*?)(?=\<li\>)', r'<li>\1</li>', html, 
...                flags=re.IGNORECASE | re.DOTALL)
>>> xhtml
'<UL><li>Blah></li><li><A>Blah</A></li><LI><A>Blah2</A></UL>'
>>> print(BeautifulSoup(xhtml).prettify())
<html>
 <body>
  <ul>
   <li>
    Blah&gt;
   </li>
   <li>
    <a>
     Blah
    </a>
   </li>
   <li>
    <a>
     Blah2
    </a>
   </li>
  </ul>
 </body>
</html>

相关问题 更多 >