一、xpath数据解析

最常用且最便捷高效的一种解析方式

通过层级关系去定位一个元素

1、xpath解析原理

  • 实例化一个 etree 的对象,并且将被解析的页面源码加载到该对象中。


  • 调用etree对象中的xpath方法结合 xpath表达式 实现标签对位和内容的捕获。

    2、xpath 环境安装

    pip install lxml

    3、如何实例化etree 对象

    **from lxml import etree**
  1. 将本地的html文档中的源码数据 加载到etree对象中:

**etree.parse(filePath)**

  1. 可以将从互联网上获取的源码数据加载到该对象中:

**etree.HTML(page_text)**

tree.xpath('xpath表达式') # xpath方法没有代码提示
返回一个列表 里面存储了元素

4、xpath表达式:

类型 序号 语句 介绍
定位元素 1 / 如果在开头表示的是从根节点开始定位 。同时也表示的是一个层级
2 // 表示多个层级,等同于bs4 select方法的 空格
3 ‘//div’ //在最左侧则表示从任意位置找div标签 [返回列表]
4 //div[@class=’song’] 属性定位,定位class为song的div 返回列表
标签[@attrName=”…”]
5 //div[@class=’ss’]/p[3] 索引定位 不是从0开始 从1开始 ,查找第三个
取文本 6 //ul[@id=’nav_left’]/li[3]/a/text() /text() 返回一个列表,里面有当前内文本信息
获取标签中直系的文本内容
7 //text() //text() 返回一个列表 返回一个标签下所有层级的文本
获取标签中非直系的文本内容(所有的文本内容)
取属性 8 //li[3]/a/@href 获得a 标签的href属性 /@属性

5、注意事项:

  • 局部节点调用xpath()方法时,一定要记得在xpath表达式前加上 **./**

  • 如果页面乱码 就把 responseencoding属性改成 网页的head标签中<meta charset="gbk"> 一致 即可


  • 通用处理局部乱码的解决方案

    • **img_name = img_name.code('iso-8859-1').decode('gbk')**
  • xpath表达式 可以使用 | 来执行两个xpath表达式 或 【更强的通用性】

    • tree.xpath("xpath表达式1 | xpath表达式2")

6、爬取58同城房源信息

  1. import requests
  2. from lxml import etree
  3. import os
  4. if __name__ == '__main__':
  5. url = "https://sjz.58.com/ershoufang/"
  6. headers = {
  7. "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0"
  8. }
  9. page_text = requests.get(url, headers=headers).text
  10. page_tree = etree.HTML(page_text)
  11. li_list = page_tree.xpath("//div[@class='content-side-left']/ul[@class='house-list-wrap']/li")
  12. fp = open("./二手房/二手房信息.txt", "w", encoding="utf-8")
  13. for li in li_list:
  14. # xpath表达式一定要加上 ./ 表示从局部的开始定位元素
  15. info_text = li.xpath("./div[@class='list-info']/h2/a/text()")[0] + "\n"
  16. fp.write(info_text)
  17. print("房源信息爬取完毕")

7、爬取4k图片

  1. import requests
  2. from lxml import etree
  3. if __name__ == '__main__':
  4. url = "http://pic.netbian.com/4kmingxing/"
  5. headers = {
  6. "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0"
  7. }
  8. response = requests.get(url, headers=headers)
  9. # 设置编码格式,要和网页的head标签中<meta charset="gbk"> 一致
  10. response.encoding = "gbk"
  11. response_text = response.text
  12. page_tree = etree.HTML(response_text)
  13. # 获取页面的li集合,里面有a标签
  14. li_list = page_tree.xpath("//div[@class='slist']/ul[@class='clearfix']/li")
  15. fp = None
  16. for li in li_list:
  17. img_src = "http://pic.netbian.com" + li.xpath("./a/img/@src")[0]
  18. file_name = li.xpath("./a/img/@alt")[0] + ".jpg"
  19. print("%s 爬取完毕" % file_name)
  20. fp = open("./4k图片/"+file_name, "wb")
  21. response_b = requests.get(img_src).content
  22. fp.write(response_b)
  23. fp.close()
  24. print("图片爬取完毕")