【问题标题】:python RE findall() return value is an entire stringpython RE findall() 返回值是一个完整的字符串
【发布时间】: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 分开。我该怎么办?

【问题讨论】:

  • 如果以下答案之一解决了您的问题,您应该接受它。

标签: python html regex web-crawler


【解决方案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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-20
    • 2017-05-28
    • 2021-10-09
    • 2020-09-04
    • 2014-02-13
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多