有内置的包可以将HTML解析成DOM吗?
我发现了 HTMLParser
可以用来处理SAX,还有 xml.minidom
可以用来处理XML。我这边的HTML格式还不错,所以不需要太复杂的解析器,有什么推荐的吗?
5 个回答
22
BeautifulSoup和lxml确实很不错,但在这里不太合适,因为问题是关于内置模块的。下面是一个使用内置的minidom模块来解析HTML字符串的例子。这个例子是在cPython 3.5.2上测试过的:
from xml.dom.minidom import parseString
html_string = """
<!DOCTYPE html>
<html><head><title>title</title></head><body><p>test</p></body></html>
"""
# extract the text value of the document's <p> tag:
doc = parseString(html_string)
paragraph = doc.getElementsByTagName("p")[0]
content = paragraph.firstChild.data
print(content)
不过,正如Jesse Hogan在评论中提到的,这个方法在处理一些minidom无法识别的HTML实体时会失败。这里有一个更新的解决方案,使用Python3的html.parser模块:
from html.parser import HTMLParser
html_string = """
<!DOCTYPE html>
<html><head><title>title</title></head><body><p> test</p><div>not in p</div></body></html>
"""
class Parser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.in_p = []
def handle_starttag(self, tag, attrs):
if (tag == 'p'):
self.in_p.append(tag)
def handle_endtag(self, tag):
if (tag == 'p'):
self.in_p.pop()
def handle_data(self, data):
if self.in_p:
print("<p> data :", data)
parser = Parser()
parser.feed(html_string)
31
我推荐使用 lxml。我喜欢BeautifulSoup,但它在维护上有些问题,而且在后来的版本中兼容性也不太好。使用lxml让我很满意。
后来:最好的推荐是使用lxml、html5lib,或者BeautifulSoup 3.0.8。BeautifulSoup 3.1.x是为python 3.x设计的,已知在早期的python版本中会有问题,正如BeautifulSoup网站上所提到的。
Ian Bicking写了一篇关于使用lxml的不错的文章。
ElementTree也是一个推荐,但我自己从来没有用过。
2012-01-18:有人来给我和Bartosz点了反对票,因为我们推荐了一些容易获取但不属于python发行版的包。所以对于那些非常字面理解的StackOverflow用户来说:“你可以使用xml.dom.minidom,但没有人会推荐它比其他选择更好。”
16
看看这个叫做 BeautifulSoup 的工具。它很受欢迎,而且在解析HTML方面表现得非常好。