【问题标题】: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("")

【问题讨论】:

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


    【解决方案1】:

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

    例如,

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

    结果:re.compile("line")

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

    【讨论】:

      【解决方案2】:

      该语句查找hrefre.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 我很想知道发生了什么变化,为什么你不接受这个答案?如果您觉得其中任何部分有问题,我想改进。
        猜你喜欢
        • 2012-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-21
        • 2010-09-27
        • 2011-12-17
        • 2010-11-21
        相关资源
        最近更新 更多