Python爬虫网页,解析工具lxml.html(一)

  

  狭义上讲,爬虫只负责抓取,也就是下载网页。而实际上,爬虫还要负责从下载的网页中提取我们想要的数据,即对非结构化的数据(网页)进行解析提取出结构化的数据(有用数据)。比如,我们要抓取了一个新闻页面的网页(html)下来,但我们想要的是这个网页中关于新闻的结构化数据:新闻的标题,新闻的发布时间,新闻的正文等。   

      Python爬虫网页,解析工具lxml.html(一)   
     

  所以说,网页下载下来只是第一步,还有重要的一步就是数据提取。不同的爬虫想要的数据不一样,提取的数据也就不一样,但提取方法都是类似的。   

  

  最简单的提取数据的方法,就是使用正则表达式,此种方法简单,提取的逻辑也不能复杂,不然写出的正则表达式就晦涩难懂,甚至不能提取复杂的数据结构。   

  

  经过多年的使用经验,选择了lxml和xpath来解析网页提取结构化数据。顺便说一下BeautifulSoup,它也是一个很棒的解析HTML的工具,可以使用多个解析器,比如Python标准库的解析器,但是速度比较慢,也可以使用lxml作为解析器,但是它的使用方法,API跟lxml不太一样。使用下来,还是lxml的API更舒服。   

  

  lxml对C语言库libxml2和libxslt进行绑定,提供了神谕的的API,它有一些主要特点:   

  
      <李>   支持标准的XML   李   <李>   支持(损坏)的HTML   李   <李>   非常快的解析速度   李   <李>   神谕的的API更易于使用   李   <李>   使用Python的unicode字符串   李   <李>   内存安全(没有段错误)   李   <李>   不需要手动管理内存   李   
  

  总结为一句话就是,C语言的速度和Python的简易相结合的神器。   

  

  lxml有两大部分,分别支持XML和HTML的解析:   

  
      <李>   lxml。etree解析XML   李   <李>   lxml。html解析html   李   
  

  lxml。etree可以用来解析RSS提要,它就是一个XML格式的文档。然而爬虫抓取的绝大部分都是html网页,所以,我们这里主要讲述lxml.html解析网页的方法。   

  

  lxml。html从html字符串生成文档树结构   

  

  我们下载得到的网页就是一串html字符串,如何把它输入给lxml.html模块,从而生成html文档的树结构呢?   
  该模块提供了几种不同的方法:   

  
      <李>   解析(filename_url_or_file):   
      输入的是一个文件名、URL或文件对象(有读()方法)。   李   <李>   document_fromstring(字符串):   
      输入的是一个html的字符串,创建一个html文档树结构,它的根节点就是,和子节点。   李   <李>   fragment_fromstring(字符串,create_parent=False):   
      返回输入字符串的HTML片段。这个片段壁纸只含有一个元素(元素),也就是单一节点,除非给出了create_parent参数,否则会报的错。   李   <李>   fragments_fromstring(字符串):   
      返回包含输入字符串中所有片段的列的表。   李   <李>   fromstring(字符串):   
      返回值依据输入字符串而定,如果输入看起来像是一个文档,则返回   <代码>   document_fromstring(字符串)      ,如果是一个单一片段,则返回   <代码>   fragment_fromstring(字符串)      。   李   
  

  下面我们通过具体示例来说明上面几个方法的不同。   

  

  document_fromstring的使用方法   

  <前>   [1]:拷贝,import  lxml.html  as  lh   [2]:拷贝,z =, lh.document_fromstring (& # 39; & lt; span> abc & lt; span> xyz & # 39;)   #,可以看的到,它自动加了根节点& lt; html>   拷贝;[3]:z   出[3]:& lt; Element  html  at  0 x7fc410667b88>   [4]:拷贝z.tag   出[4]:& # 39;html # 39;   #,还加了& lt; body>节点   [5]:拷贝,z.getchildren ()   出[5]:[& lt; Element  body  at  0 x7fc4101a3ae8>】   #,把字符串的两个节点放在了& lt; body>里面   [6]:拷贝,z.getchildren () [0] .getchildren ()   出[6]:[& lt; Element  span  at  0 x7fc410092bd8>,, & lt; Element  span  at  0 x7fc410667c28>】   

Python爬虫网页,解析工具lxml.html(一)