BeatifulSoup,Xpath,CSS 選擇器的性能比較
今天來講講關於網頁解析器的介紹,一般我們將網頁下載下來後,就要提取裡面的自己想要的內容了,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語法就不在這詳細介紹了,感興趣的小夥伴可以在網路上搜下。
TAG:機器學習入門日記 |