根据Ryan Mitchell的《用Python进行网络抓取》一书, 他用过重新编译. 有人能解释一下它的用途吗重新编译()在这种情况下重新编译()
代码是用python3编写的
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("")
在重新编译()将正则表达式编译为正则表达式对象
例如
结果:
re.compile("line")
以下是一些有关regex的好参考: 1python 3 re library 2python re.compile
这将创建一个regex对象,beauthoulsoup的
findAll
方法检查您传递的是已编译的regex还是仅传递一个字符串-这样就避免了不必要的计算,并且可以使用简单的字符串比较。(Regex是相当占用cpu的操作)。在在本例中,它被用于href属性以查找
<a>
标记的href属性内的任何位置/wiki/
,否则只需传递一个字符串,它就必须匹配整个href
属性。在另一个使用它的例子是在第一个标记参数上,以regex}标记。如果刚刚传递了一个regex字符串,它将查找
'^t[dh]$'
为例,您可以使用它来查找td
或{<^t[dh]$>
标记。在{a1}
一般来说你为什么要用重新编译在
正如其他答案所说,这“编译”一个正则表达式,直到你调用
re.match
你的正则表达式只是一个字符串,re
必须先转换它才能使用它,如果你传递一个字符串,它就会这样做,但这需要一些cpu时间。在如果您要多次使用正则表达式,例如在循环中,那么每次转换将比只使用一次时占用更多的cpu,因此在循环之前执行并重新使用将使您的速度更快。在
实际上,
re
实际上是在幕后为您执行此操作,并“缓存”转换的对象,但这本身将增加少量的工作,因此可能仍需要比手动操作更长的时间。在该语句在
href
与在re.compile中编译的正则表达式匹配的位置查找定位点。 (如果您需要了解有关regex的更多信息,请转到here)相关问题 更多 >
编程相关推荐