用xpath还是正则表达式?

本文原创作者:鲲之鹏(http://www.site-digger.com)

本文原始链接:http://www.site-digger.com/html/articles/20180716/652.html


xpath和正则表达式是数据提取时最常用的两种方法,究竟用哪个好呢?相信看过本文后你会有一个果断的选择。

测试代码如下所示,实验目标是同一HTML文档,分别使用webscrpaing库中的xpath,lxml库中的xpath以及正则表达式提取100次,统计各方法的用时:

view plain copy to clipboard print ?

  1. # coding: utf-8   

  2. # xpath_speed_test.py   

  3.   

  4. import  re  

  5. import  time  

  6. from  lxml  import  etree  

  7. from  webscraping  import  common, download, xpath  

  8.   

  9. TEST_TIMES =  100   

  10.   

  11. def  test():  

  12.     url =  'http://hotels.ctrip.com/international/washington26363'   

  13.     html = download.Download().get(url)  

  14.     html = common.to_unicode(html)  

  15.       

  16.      # 测试webscraping库的xpath提取速度   

  17.     start_time = time.time()  

  18.      for  i  in  range(TEST_TIMES):  

  19.          for  hid, hprice  in  zip(xpath.search(html,  '//div[@class="hlist_item"]/@id' ), xpath.search(html,  '//div[@class="hlist_item_price"]/span' )):  

  20.              #print hid, hprice   

  21.              pass   

  22.     end_time = time.time()  

  23.     webscraping_xpath_time_used = end_time - start_time  

  24.      print   '"webscraping.xpath" time used: {} seconds.' .format(webscraping_xpath_time_used)  

  25.       

  26.       

  27.      # 测试lxml库xpath提取速度   

  28.     start_time = time.time()  

  29.      for  i  in  range(TEST_TIMES):  

  30.         root = etree.HTML(html)  

  31.          for  hlist_div  in  root.xpath( '//div[@class="hlist_item"]' ):  

  32.             hid = hlist_div.get( 'id' )  

  33.             hprice = hlist_div.xpath( './/div[@class="hlist_item_price"]/span' )[ ].text  

  34.              #print hid, hprice   

  35.              pass   

  36.     end_time = time.time()  

  37.     lxml_time_used = end_time - start_time  

  38.      print   '"lxml" time used: {} seconds.' .format(lxml_time_used)  

  39.       

  40.      # 测试正则表达式的速度   

  41.     start_time = time.time()  

  42.      for  i  in  range(TEST_TIMES):  

  43.          for  hid, hprice  in  zip(re.compile(r 'class="hlist_item" id="(\d+)"' ).findall(html), re.compile(r '¥([\d\.]+)' ).findall(html)):  

  44.              #print hid, hprice   

  45.              pass   

  46.     end_time = time.time()  

  47.     re_time_used = end_time - start_time  

  48.      print   '"re" time used: {} seconds.' .format(re_time_used)  

  49.       

  50.       

  51. if  __name__ ==  '__main__' :  

  52.     test()  

运行结果如下:

webscraping库xpath vs lxml库xpath vs 正则表达式

view plain copy to clipboard print ?

  1. "webscraping.xpath"  time used:  100.677000046  seconds.  

  2. "lxml"  time used:  2.09100008011  seconds.  

  3. "re"  time used:  0.138999938965  seconds.  

结果很震撼:

  • 正则表达式只用了0.14秒;

  • lxml的xpath用了2.1秒;

  • webscraping的xpath用了101秒!

由于xpath简单而且灵活,我们在爬虫开发的时候一般都会首选,但是通过这个实验发现它的效率远低于正则表达式,尤其是webscrpaing库中的xpath速度更是慢得恐怖。

因此,在我们的爬虫开发过程中,应该首选正则表达式,如果用正则表达式实在难于实现,再考虑xpath,另外,在使用xpath的时候一定要选用高效的库,比如lxml。特别是在数据量特别大的时候,效率显得尤为重要。


说明:该文章为鲲之鹏(http://www.site-digger.com)原创文章 ,您除了可以发表评论外,还可以转载到别的网站,但是请保留源地址,谢谢!!(尊重他人劳动,我们共同努力)

请使用浏览器的分享功能分享到微信等