繁体   English   中英

Python正则表达式提取html段落

[英]Python regex to extract html paragraph

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

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

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

为什么不使用HTML 解析器解析 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有助于过滤掉空段落。

确保您使用re.search (或re.findall )而不是re.match ,它会尝试匹配整个 html 字符串(您的 html 绝对不是以<p>标签开头和结尾)。

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

re.findall(r'<p(\s.*?)?>(.*?)</p>', response.text, flags=re.IGNORECASE | re.MULTILINE | re.DOTALL)

反而。 问号将使您的正则表达式在第一个结束</p>标记处停止匹配,与search相比, findall将返回多个匹配项。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM