2025年3月30日 星期日 甲辰(龙)年 月廿九 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

爬虫-XPath

时间:08-16来源:作者:点击数:24

爬虫-XPath

  • #下载这个库 pip install lxml

准备学习资料(用xpath匹配标签中的元素)

  • <header class="header">
  • <a href="https://www.i4.cn/" title="爱思助手" class="logo"><img src="https://d-image.i4.cn/i4web/static2017/img/head_logo.png" width="164" height="46" alt="爱思助手"/></a>
  • <nav>
  • <a href="https://www.i4.cn/" title="首页" id="nav_index">首页</a>
  • <a href="https://www.i4.cn/pros.html" title="产品中心" id="nav_pros">产品中心</a>
  • <a href="https://www.i4.cn/firmware.html" title="固件" id="nav_ipsw">固件</a>
  • <a href="https://www.i4.cn/app_3_1_1_0_1.html" title="资源" id="nav_res">资源</a>
  • <a href="https://www.i4.cn/news_3.html" title="教程" id="nav_tutorial">教程</a>
  • <a href="https://www.i4.cn/news_1.html" title="新闻" id="nav_article">新闻</a>
  • <a href="https://developer.i4.cn" target="_blank" title="开发者平台">开发者平台</a>
  • </nav>
  • <div class="search">
  • <form method="get" action="https://www.i4.cn/index_search.action">
  • <div class="selectdown" name="search_select">
  • <div class="arrows"></div>
  • <div class="title">教程</div>
  • <div class="options">
  • <div class="list" data-value="3">教程</div>
  • <div class="list" data-value="4">资讯</div>
  • <div class="list" data-value="1">应用</div>
  • </div>
  • <input type="hidden" name="type" value="3" />
  • </div>
  • <input type="hidden" name="model" value="1" />
  • <input type="text" name="k" id="textfield">
  • <a href="javascript:;" title="搜索">搜索</a>
  • </form>
  • </div>
  • </header>

使用xpath读取变量中的文本

  • from lxml import etree --导入模块
  • data = etree.HTML(上面的文本或者是一个网页源码) --得到一个html对象(自动补全HTML标签)
  • data_1 = etree.tostring(data,encoding='utf-8') --字节编码方式得到一个HTML的原文,有中文的话需要encoding解码
  • data_2 = data_1.decode('utf-8') --对字节串中文解码,再次进行输入就是网页源代码

使用xpath读取本地html文本文件

  • from lxml import etree --导入模块
  • data = etree.parse('./练习.html', etree.HTMLParser()) -- 读取本地文件(自动补全标签)
  • data = etree.tostring(data, encoding='utf-8') --读取文件,指定编码
  • data = data.decode() --对字节串进行解码

使用xpath进行匹配标签

  • from lxml improt etree
  • data = 上面的练习资料 --仿爬虫获得的html响应
  • html = data.HTML(data) --得到html对象,自带有xpath语法
  • content = html.xpath('//a')
  • #通过表达式('//a')得到一文件中的所有a标签(当前文件中有9个a标签),返回一个html对象列表
  • restal = etree.tostring(a_html[0],pretty_print=True,method="html",encoding='utf-8')
  • #解码为utf8形式
  • 表达式实例:
  • ('//nav/a') -- 表示查询nav节点下的所有a标签
  • ('//nav/a/@target') --表示查询@target属性的值
  • html = etree.HTML(HTML)
  • a_html = html.xpath('//nav/a/@target')
  • print(a_html[0])
  • #输出:_blank
  • ('//nav/a[@target="_blank"]') --表示根据target属性等于_blank作为条件查询
  • html = etree.HTML(HTML)
  • a_html = html.xpath('//nav/a[@target="_blank"]')
  • restal = etree.tostring(a_html[0],pretty_print=True,method="html",encoding='utf-8')
  • print(restal.decode())
  • #输出: <a href="https://developer.i4.cn" target="_blank" title="开发者平台">开发者平台</a>
  • ('//nav/a/..') --选取a标签的父级标签
  • #输出为:所有nav的标签
  • ('//nav/a[7]') --选取a标签中下标为7的元素
  • ('//nav/a[7]/text()') --选取nav下的第7个a标签中的文本数据
  • html = etree.HTML(HTML)
  • a_html = html.xpath('//nav/a[7]/text()')
  • print(a_html)
  • #输出:['开发者平台']
  • ('//nav/a/text()') --获取nav中所有a标签的所有文本数据
  • ('//nav/a[7]/@title') --获取nav下的a标签中第7个tittle属性
  • #输出:['开发者平台']
  • ('//nav/a[@title="新闻" or @title="教程"]') --获取title属性为新闻或者教程的标签
  • html = etree.HTML(HTML)
  • a_html = html.xpath('//nav/a[@title="新闻" or @title="教程"]')
  • restal = etree.tostring(a_html[1],pretty_print=True,method="html",encoding='utf-8')
  • print(restal)
  • #输出:<a href="https://www.i4.cn/news_1.html" title="新闻" id="nav_article">新闻</a>
  • ('//nav/a[@title="新闻" or @title="教程"]/text()') --同上获取标签中的文本
  • ('//nav/a[last()]') --获取nav标签中a标签的最后一个标签
  • ('//nav/a[last() - 1]') --获取nav标签中a标签的最后一个标签的前一个标签
  • ('//nav/a[position() < 3]') --获取nav中的a标签前两个元素
  • html = etree.HTML(HTML)
  • a_html = html.xpath('//nav/a[position() < 3]')
  • for i in range(0,len(a_html)):
  • restal = etree.tostring(a_html[i],pretty_print=True,method="html",encoding='utf-8')
  • print(restal.decode())

xpath语法

  • nodename -- 选取此节点的所有子节点
  • / -- 从当前节点选取直接子节点
  • // -- 从当前节点选取子孙节点
  • . -- 选取当前节点
  • .. -- 选取当前节点的父节点
  • @ -- 选取属性
在这里插入图片描述
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐