python RE findall() 返回值是一个完整的字符串

Posted

技术标签:

【中文标题】python RE findall() 返回值是一个完整的字符串【英文标题】:python RE findall() return value is an entire string 【发布时间】:2015-07-04 14:36:54 【问题描述】:

我正在编写一个爬虫来获取 html 文件的某些部分。但我不知道如何使用 re.findall()。

这里是一个例子,当我想在文件中找到所有...部分时,我可能会这样写:

re.findall("<div>.*\</div>", result_page)

如果result_page是一个字符串"&lt;div&gt; &lt;/div&gt; &lt;div&gt; &lt;/div&gt;",结果将是

['<div> </div> <div> </div>']

只有整个字符串。这不是我想要的,我期望两个 div 分开。我该怎么办?

【问题讨论】:

如果以下答案之一解决了您的问题,您应该接受它。 【参考方案1】:

引用the documentation,

'*''+''?' 限定符都是贪婪的;他们尽可能匹配 尽可能的文字。在限定符之后添加'?' 使其执行 以非贪婪或最小的方式匹配;尽可能少的字符 将被匹配。

只要加上问号:

In [6]: re.findall("<div>.*?</div>", result_page)
Out[6]: ['<div> </div>', '<div> </div>']

此外,您不应该使用 RegEx 来解析 HTML,因为 HTML 解析器正是为此而生的。使用BeautifulSoup 4 的示例:

In [7]: import bs4

In [8]: [str(tag) for tag in bs4.BeautifulSoup(result_page)('div')]
Out[8]: ['<div> </div>', '<div> </div>']

【讨论】:

为什么我不应该使用 RegEx 来解析 HTML?正确的方法是什么? @alvinzoo 总是有 HTML 解析器,例如Python的美丽汤。您可能想阅读this famous question。【参考方案2】:

*greedy 运算符,您想使用*? 进行非贪婪匹配。

re.findall("<div>.*?</div>", result_page)

或者使用 BeautifulSoup 之类的解析器代替正则表达式来完成这个任务:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html)
soup.find_all('div')

【讨论】:

以上是关于python RE findall() 返回值是一个完整的字符串的主要内容,如果未能解决你的问题,请参考以下文章

python学习——re模块

Python re 模块findall() 函数返回值展现方式详解

python re的findall和finditer

re.findall 不返回完整匹配?

re库和正则表达式

re模块和分组