Python 正则表达式提取 html 段
Python regex to extract html paragraph
我正在尝试使用以下代码行从 HTML 中提取段落:
paragraphs = re.match(r'<p>.{1,}</p>', html)
但它 returns none 尽管我知道有。为什么?
您应该使用 re.search
而不是 re.match
。前者将搜索整个字符串,而后者仅在模式位于字符串开头时才匹配。
也就是说,正则表达式是一个糟糕的解析工具HTML。你很快就会和他们碰壁。我强烈建议您查看 HTMLParser 或 BeautifulSoup 来完成您的任务。
确保您使用 re.search
(或 re.findall
)而不是 re.match
,它会尝试匹配整个 html 字符串(您的 html绝对不是以 <p>
标签开始和结束。
还应注意,目前您的搜索是贪婪的,这意味着它将 return first <p>
标记和最后一个 </p>
之间的所有内容这是你绝对不想要的。尝试
re.findall(r'<p(\s.*?)?>(.*?)</p>', response.text, flags=re.IGNORECASE | re.MULTILINE | re.DOTALL)
相反。问号将使您的正则表达式在第一个结束 </p>
标记处停止匹配,与 search
.
相比,findall
将 return 匹配多个
为什么不使用 HTML 解析器 parse HTML. Example using 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
有助于过滤掉空段落。
我正在尝试使用以下代码行从 HTML 中提取段落:
paragraphs = re.match(r'<p>.{1,}</p>', html)
但它 returns none 尽管我知道有。为什么?
您应该使用 re.search
而不是 re.match
。前者将搜索整个字符串,而后者仅在模式位于字符串开头时才匹配。
也就是说,正则表达式是一个糟糕的解析工具HTML。你很快就会和他们碰壁。我强烈建议您查看 HTMLParser 或 BeautifulSoup 来完成您的任务。
确保您使用 re.search
(或 re.findall
)而不是 re.match
,它会尝试匹配整个 html 字符串(您的 html绝对不是以 <p>
标签开始和结束。
还应注意,目前您的搜索是贪婪的,这意味着它将 return first <p>
标记和最后一个 </p>
之间的所有内容这是你绝对不想要的。尝试
re.findall(r'<p(\s.*?)?>(.*?)</p>', response.text, flags=re.IGNORECASE | re.MULTILINE | re.DOTALL)
相反。问号将使您的正则表达式在第一个结束 </p>
标记处停止匹配,与 search
.
findall
将 return 匹配多个
为什么不使用 HTML 解析器 parse HTML. Example using 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
有助于过滤掉空段落。