Python正则表达式提取html段落

时间:2015-12-29 01:36:25

标签: python html regex html-parsing

我正在尝试使用以下代码行从HTML中提取parapgraph:

paragraphs = re.match(r'<p>.{1,}</p>', html)

但即使我知道有,也没有返回。为什么?

3 个答案:

答案 0 :(得分:10)

为什么不使用 HTML解析器,以及parse HTML。使用BeautifulSoup的示例:

>>> from bs4 import BeautifulSoup
>>> 
>>> data = """
...     <div>
...         <p>text1</p>
...         <p></p>
...         <p>text2</p>
...     </div>
... """
>>> soup = BeautifulSoup(data, "html.parser")
>>> [p.get_text() for p in soup.find_all("p", text=True)]
[u'text1', u'text2']

请注意,text=True有助于过滤掉空段落。

答案 1 :(得分:3)

请务必使用re.search(或re.findall)代替re.match,它会尝试匹配整个html字符串(您的html绝对不是以{{1}开头和结尾}标签)。

还应注意,目前您的搜索是贪婪的,这意味着它将返回第一个 <p>标记与最后一个<p>之间的所有内容,这是您绝对不需要的内容。试试

</p>

代替。问号将使您的正则表达式在第一个结束re.findall(r'<p>.*?</p>', html) 标记处停止匹配,与</p>

相比,findall将返回多个匹配项

答案 2 :(得分:2)

您应该使用re.search代替re.match。前者将搜索整个字符串,而后者仅在模式位于字符串的开头时才匹配。

也就是说,正则表达式是解析HTML的可怕工具。很快你就会和他们碰壁。我强烈建议您查看HTMLParser或BeautifulSoup以完成任务。