#! /usr/bin/python3
import re
import xml.dom.minidom
from html import escape, unescape
def minidom_parseHtml(text: str):
"parse html text with non-xml html-entities as minidom"
textXML = re.sub("\\&\\w+\\;", lambda x: escape(unescape(x.group(0))), text)
return xml.dom.minidom.parseString(textXML)
5条答案
按热度按时间e5nszbig1#
我推荐lxml。我喜欢BeautifulSoup,但一般都有维护问题,并且与后来的版本存在兼容性问题。我很高兴使用lxml。
稍后:最好的建议是使用lxml、html5 lib或BeautifulSoup 3.0.8。BeautifulSoup 3.1.x是为python 3.x设计的,并且已知早期python版本as noted on the BeautifulSoup website存在问题。
Ian Bicking有一篇关于使用lxml的good article。
ElementTree是一个进一步的建议,但我从来没有使用过它。
2012-01-18:有人来了,决定否决我和Bartosz,因为我们推荐的Python包很容易获得,但不是Python发行版的一部分。所以对于高度文字化的StackOverflowers:您可以使用xml.dom.minidom,但没有人会推荐使用它而不是其他替代方案。
pcww981p2#
BeautifulSoup和lxml都很棒,但在这里并不是合适的答案,因为问题是关于内建的。下面是一个使用内置minidom模块解析HTML字符串的示例。使用cPython 3.5.2测试:
然而,正如Jesse Hogan的评论所指出的,这将在mindom无法识别的HTML实体上失败。下面是一个使用Python3 html.parser模块的更新解决方案:
ifmq2ha23#
看看BeautifulSoup。它在解析HTML方面很受欢迎并且非常出色。
bybem2ql4#
要处理DOM对象,可以使用python的HTMLDOM。
6fe3ivhb5#
有一个技巧只使用python3内置函数(3.4+)
使用
html.unescape
解码所有html5实体。然后使用html.escape
将<>"&
编码回xml解析器的实体,将其他实体作为unicode字符留在字符串中。