在BeautifulSoup中使用re.compile有什么用?

时间:2017-02-26 02:53:03

标签: python regex python-3.x web-scraping beautifulsoup

根据Ryan Mitchell撰写的Web Scraping with Python, 他用re.compile。任何人都可以解释在这种情况下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("")

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

re.compile()将正则表达式编译为正则表达式对象

例如,

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

结果:re.compile("line")

以下是关于正则表达式的一些很好的参考: 1. python 3 re library 2. python re.compile

答案 2 :(得分:1)

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

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

使用它的另一个例子是第一个标记参数,使用你可能用来查找'^t[dh]$'td标记的正则表达式th。如果只是传递一个正则表达式字符串,它将真正寻找<^t[dh]$>标签。

See Docs for findAll method

一般为什么要使用re.compile

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

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

实际上re实际上是在幕后为你做这个,并且&#34;缓存&#34;转换后的对象,但是它自己会添加少量的工作,所以仍然需要比手动操作更长的时间。