我找到了用于sax的HTMLParser和用于xml的xml.minidom。我有一个非常好的html,所以我不需要太强大的解析器 - 任何建议?
答案 0 :(得分:26)
我会推荐lxml。我喜欢BeautifulSoup,但是通常存在维护问题以及后续版本的兼容性问题。我很高兴使用lxml。
后来:最好的建议是使用lxml,html5lib或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,但没有人会推荐这个替代。”
答案 1 :(得分:15)
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的comment所示,对于未被mindom识别的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)
答案 2 :(得分:11)
看看BeautifulSoup。它在解析HTML时很受欢迎。
答案 3 :(得分:2)
要处理DOM对象,可以使用HTMLDOM进行python。