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

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']
      
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值