今天来讲讲关于网页解析器的介绍,一般我们将网页下载下来后,就要提取里面的自己想要的内容了,python库自带的正则表达式re库虽然能完成这个任务,但是对于一些网页结构比较复杂点的网站,使用re库构造正则表达式就变得很费力了,所以需要引入第三方库。
目前,市面上常见的网页解析器除了re,还有BeautifulSoup库,lxml库(Xpath, CSS),今天我们来比较一下这两个第三方库的性能。
代码如下所示:
importrequests
frombs4importBeautifulSoup
fromparselimportSelector
fromlxmlimportetree
importtime
defget_html(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
returnr.text
except:
return""
defbs_parse(html):
results1 = []
soup = BeautifulSoup(html,'html.parser')
a = soup.find_all('a')
foriina:
try:
href = i.get('href')# 等同于 href = i.attrs['href']
results1.append(href[])# 表示匹配 sh 或者 sz 加6位数字的内容
except:
continue
defbs_parse_with_lxml(html):
results1 = []
soup = BeautifulSoup(html,'lxml')
a = soup.find_all('a')
foriina:
try:
href = i.get('href')# 等同于 href = i.attrs['href']
results1.append(href[])# 表示匹配 sh 或者 sz 加6位数字的内容
except:
continue
defxpath_parse(html):
s = Selector(text=html)
results2= s.xpath('//a[@href]/text()').extract()
defxpath_etree(html):
s = etree.HTML(html)
results2= s.xpath('//a[@href]/text()')
defcss_parse(html):
s = Selector(text=html)
results3= s.css('a::attr(href)').extract()
defmain():
url ='http://quote.eastmoney.com/stocklist.html'
html = get_html(url)
num_iterations =100# 每个爬虫测试100次
function_called = [('bs', bs_parse), ('bs_lxml', bs_parse_with_lxml),
('xpath', xpath_parse),('xpath_etree', xpath_etree), ('css', css_parse)]
forname, funcinfunction_called:
start_time = time.time()
foriinrange(num_iterations):
func(html)
end_time = time.time()
print("=================================================================")
print('%s: %.2f seconds'% (name, end_time - start_time))
main()
运行结果如下:
下面进行总结:
Xpath和CSS都是使用lxml库,在使用Selector进行网页解析的情况下,CSS比Xpath稍微快一点点,但是如果Xpath引入lxml的etree进行解析,则比CSS快,不过Xpath定位元素比CSS容易好多,个人偏向于使用Xpath。
BeautifulSoup库是最慢的,因为bs也支持lxml,在bs中使用lxml能大幅提高解析速度,但是和Xpath和CSS差距还是很大。
lxml库和re库的速度相当,有些地方也还是要使用到re库的。
所以,在日常解析网页中,一般都是以xpath为主,re为辅。
下面给出Xpath和CSS的一张比较图。
关于Xpath和CSS语法就不在这详细介绍了,感兴趣的小伙伴可以在网络上搜下。
领取专属 10元无门槛券
私享最新 技术干货