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是一个字符串"<div> </div> <div> </div>"
,结果将是
['<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() 返回值是一个完整的字符串的主要内容,如果未能解决你的问题,请参考以下文章