欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python爬虫学习第三章-4.1.1-xpath解析概述

程序员文章站 2022-05-07 23:08:34
...

Python爬虫学习第三章-4.1.1-xpath解析概述

  这一节主要是介绍xpath

1、xpath解析原理:

  1. 实例化一个etree类的的对象,并且需要将被解析的List item页面源码数据加载到该对象中。
  2. 调用etree对象中的xpath方法并结合着xpath表达式实现标签的定位和内容的捕获(捕获到的是标签或者标签属性中的文本内容)。

2、如何实例化一个etree类的对象:先from lxml import etree

  • 将本地的html文档中的源码数据加载到etree对象中:可以调用etree.parse(HtmlFilePath)返回一个etree对象,其中参数是html文件的路径。
  • 可以将从互联网上获取的页面源码数据加载到该对象中:etree.HTML('page_text'),page_text是从互联网上获取的响应数据
  • 实例化etree对象完成后,就可以调用xpath(‘xpath表达式’)方法(返回的是一个列表),关键就是xpath表达式的编写,可以根据不同的xpath表达式定位到不同的标签以及捕获标签中的文本数据

3、xpath表达式(xpath函数返回的是一个列表):

  • 形如’/html/body/div’:左边/表示的是从根节点开始定位,中间的‘/’表示一个层级,‘/’就相当于bs4中‘>’;‘//’表示的是多个层级,相当都bs4中的空格,也可以表示从任意地方开始定位。例如tree.xpath('/html/body/div')tree.xpath('/html//div')返回相同的内容,tree.xpath('//div')是从任意位置找div标签,也就是找html文件中的所有div标签。
  • 利用xpath进行定位
    • 利用xpath进行属性定位:例如定位到指定class='song’的div,可以用tree.xpath('//div[@class="song"]'),其中@是固定符号,通用写法是:tagName[@attrName="attrValue"]
    • 利用xpath进行索引定位:例如定位到body下面,class属性值为song的div标签中的第三个p标签(<p>苏轼</p>),可以用tree.xpath('//div[@class="song"]/p[3]'),注意索引是从1开始。
  • 如何从xpath方法返回的element对象列表中取文本、取属性
    • 取文本:取的是标签中间的文本内容,用/text()或者//text()。比如取“杜牧”这两个字,而这两个字在class属性值为tang的div标签下面的ul标签下面的li标签下面的a标签中,所以可以通过层级来进行定位a标签,在HTML文件中源代码如下:

      <div class="tang">
      	<ul>
      		<li><a href="http://www.baidu.com" title="qing">清明时节雨纷纷,路上行人欲断魂</a> </li>
      		<li><a href="http://www.163.com" title="qin">秦时明月汉时关,万里长征人未还</a> </li>
      		<li><a href="http://www.126.com" title="qi">歧王宅里寻常见,崔九堂前几度闻</a> </li>
      		<li><a href="http://www.sina.com" title="du">杜甫</a> </li>
      		<li><a href="http://www.dudu.com" title="du">杜牧</a> </li>
      		<li><b>杜小月</b></li>
      		<li><i>度蜜月</i></li>
      		<li><a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流</a></li>
      	</ul>
      </div>
      

      可以通过下面的代码获取数据:

      d = tree.xpath('//div[@class="tang"]/ul/li[5]/a')
      print(d)
      #输出的是:[<Element a at 0x2417b236788>]
      d_List_text = tree.xpath('//div[@class="tang"]/ul/li[5]/a/text()') #在最后加个text()就可以取到内容
      print(d_List_text)
      #输出的是:['杜牧']
      d_text = tree.xpath('//div[@class="tang"]/ul/li[5]/a/text()')[0]  # 在最后加个text()就可以取到内容
      print(d_text)
      #输出的是:杜牧
      

      注意获取的是直系标签中的内容,比如tree.xpath('//li[7]/text()')返回的是空列表,但tree.xpath('//li[7]//text()')tree.xpath('//li[7]/i/text()')就能返回内容。
      也可以这样总结:
            /text() 获取的是标签中直系的文本内容
            //text() 获取的是标签中非直系的文本内容(也就是标签中所有的文本内容)

    • 取属性:取的是定位到的标签中的属性的属性值,用/@属性名称。比如取class属性值为tang的div标签下的img标签当中的src属性值。在html文件中源码如下:

      <div class="song">
      	<p>李清照</p>
          <p>王安石</p>
          <p>苏轼</p>
          <p>柳宗元</p>
          <a href="http://www.song.com/" title="赵匡胤" target="_self">
          	<span>this is span</span>
                         宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a>
          <a href="" class="du">总为浮云能避日,长安不见使人愁</a>
          <img src="http://www.baidu.com/meinv.jpg" alt="" />
      </div>
      

      可以通过下面的代码获取数据:

      h = tree.xpath('//div[@class="song"]/img/@src')  #取属性值可以是/@属性名称
      print(h)
      #输出的是:['http://www.baidu.com/meinv.jpg']
      
相关标签: 爬虫 python