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

时间:2014-07-28 11:03:01

标签: python beautifulsoup

我正在尝试从列表数据格式错误的<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将在列表项的末尾添加所有结束标记。

2 个答案:

答案 0 :(得分:3)

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

  • html.parser(内置)
  • lxml的HTML解析器
  • lxml的XML解析器
  • html5lib(在这种情况下适用)

您可以使用反复试验或专门查看您的问题以及每个解析器处理它的方式(使用上面的链接)并选择一个以您希望的方式运行的解析器。

答案 1 :(得分:1)

如果没有嵌套列表项,您可以使用正则表达式手动关闭<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>