根据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("")
答案 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]$>
标签。
正如其他答案所说&#34;编译&#34;一个正则表达式,直到你调用re.match
你的正则表达式只是一个字符串,re
必须先转换它才能使用它,如果你传递一个字符串它会这样做,但这需要一些cpu时间
如果你要多次使用正则表达式,例如循环,那么每次转换将比使用一次只使用更多的cpu,所以在循环之前执行它并重新使用会给你一个更快的速度。
实际上re
实际上是在幕后为你做这个,并且&#34;缓存&#34;转换后的对象,但是它自己会添加少量的工作,所以仍然需要比手动操作更长的时间。