BeautifulSoup 中 re.compile 的用途是啥?

Posted

技术标签:

【中文标题】BeautifulSoup 中 re.compile 的用途是啥?【英文标题】:what is the use of re.compile in BeautifulSoup?BeautifulSoup 中 re.compile 的用途是什么? 【发布时间】:2017-07-16 19:04:18 【问题描述】:

根据 Ryan Mitchell 的《Web Scraping with Python》一书, 他使用重新编译。任何人都可以解释一下 re.compile() 在这种情况下的用途,以及 re.compile() 中的内容

代码是用 python 3 编写的

from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
pages = set()
def getLinks(pageUrl):
    global pages
    html = urlopen("http://en.wikipedia.org"+pageUrl)
    bsObj = BeautifulSoup(html)
    for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")):
        if 'href' in link.attrs:
            if link.attrs['href'] not in pages:
                #We have encountered a new page
                newPage = link.attrs['href']
                print(newPage)
                pages.add(newPage)
                getLinks(newPage)
getLinks("")

【问题讨论】:

【参考方案1】:

re.compile() 将一个正则表达式编译成一个正则表达式对象

例如,

line = re.compile("line")
print(line)

结果:re.compile("line")

这里有一些关于正则表达式的好参考: 1.python 3 re library 2.python re.compile

【讨论】:

【参考方案2】:

该语句查找href 与re.compile 中编译的正则表达式匹配的锚点。 (如果您需要了解更多关于正则表达式的信息,请转至here)

【讨论】:

【参考方案3】:

这会创建一个正则表达式对象,BeautifulSoup 的findAll 方法会检查您是否传递了已编译的正则表达式或仅传递一个字符串 - 这样可以避免进行不必要的计算,并且可以只使用简单的字符串比较。 (正则表达式是相当 cpu 密集型操作)。

在这种情况下,它被用在 href 属性上以在 <a> 标签的 href 属性内的任何位置查找 /wiki/,否则只需传递一个字符串,它就必须匹配整个 href 属性。

另一个使用示例是在第一个标签参数上,使用正则表达式'^t[dh]$',您可以使用它来查找tdth 标签。如果只是传递一个正则表达式字符串,它实际上会寻找<^t[dh]$> 标签。

See Docs for findAll method

一般你为什么要使用 re.compile

正如其他答案所说,这“编译”了一个正则表达式,直到你调用 re.match 你的正则表达式只是一个字符串,re 必须先转换它才能使用它,如果你传递一个字符串它会这样做,但这需要一些 cpu 时间。

如果您要多次使用正则表达式,例如在一个循环中,那么每次转换将使用比只执行一次更多的 cpu,因此在循环之前执行并重新使用会给您一个速度更快。

实际上re 实际上是在幕后为您执行此操作并“缓存”转换后的对象,但这本身会增加少量工作,因此仍可能比您手动执行要花费更长的时间。

【讨论】:

如果我传入<a href="https://wikipedia.org/wiki/BMW">BMW</a> 之类的内容会发生什么输出? @johnsonlai 你是什么意思通过它?通过重新编译这个字符串?或作为 HTML 到 BeautifulSoup?正则表达式正在寻找带有文本“/wiki/”的标签。所以如果这就是你的意思,它会匹配这个标签。 @johnsonlai 我很想知道发生了什么变化,为什么你不接受这个答案?如果您觉得其中任何部分有问题,我想改进。

以上是关于BeautifulSoup 中 re.compile 的用途是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Python2上的`setattr()``_sre.SRE_Pattern`

Python beautifulsoup 获取标签中的值 怎么获取?

Python--BeautifulSoup库安装

Beautifulsoup模块

解析库之beautifulsoup,pyquery

Python爬虫之Beautifulsoup模块的使用