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]$'
,您可以使用它来查找td
或th
标签。如果只是传递一个正则表达式字符串,它实际上会寻找<^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`