Python爬虫(十二)_XPath与lxml类库

Python学习指南

有同学说,我正则用的不好,处理HTML文档很累,有没有其他的方法? 有!那就是XPath,我们可以用先将HTML文档转换成XML文档,然后用XPath查找HTML节点或元素。

什么是XML

  • XML指可扩展标记语言(Extensible Markup Language)
  • XML是一种标记语言,很类似HTML
  • XML的设计宗旨是传输数据,而非显示数据。
  • XML的标签需要我们自行定义。
  • XML被设计为具有自我描述性。
  • XML是W3C的推荐标准。

W3School官方文档:http://www.w3school.com.cn/xml/index.asp

XML和HTML的区别

数据格式描述设计目标
XMLExtensible Markup Language (可扩展标记语言)被设计为传输和存储数据,其焦点是数据的内容。
HTMLHyperText Markup Language(超文本标记语言)显示数据以及如何更好显示数据。
HTML DOMDocument Object Model for HTML (文档对象模型)通过 HTML DOM,可以访问所有的 HTML 元素,连同它们所包含的文本和属性。可以对其中的内容进行修改和删除,同时也可以创建新的元素。

XML文档实例

<?xml version="1.0" encoding="utf-8"?><bookstore> <book category="cooking"> <title lang="en">Everyday Italian</title>  <author>Giada De Laurentiis</author>  <year>2005</year>  <price>30.00</price> </book>  <book category="children"> <title lang="en">Harry Potter</title>  <author>J K. Rowling</author>  <year>2005</year>  <price>29.99</price> </book>  <book category="web"> <title lang="en">XQuery Kick Start</title>  <author>James McGovern</author>  <author>Per Bothner</author>  <author>Kurt Cagle</author>  <author>James Linn</author>  <author>Vaidyanathan Nagarajan</author>  <year>2003</year>  <price>49.99</price> </book> <book category="web" cover="paperback"> <title lang="en">Learning XML</title>  <author>Erik T. Ray</author>  <year>2003</year>  <price>39.95</price> </book> </bookstore>

HTML DOM模型示例

HTML DOM定义了访问和操作HTML文档的标准方法,以树结构方式表达了HTML文档。

HTML DOM

XML的节点关系

1.父(Parent) 每个元素以及属性都有一个父。 下面是一个简单的XML例子中,book元素时title、author、year以及price

<?xml version="1.0" encoding="utf-8"?><book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price>
</book>

2.子(Children) 元素节点可能有零个、一个或多个子。 在下面的例子中,title、author、year以及price元素都是book元素的子:

<?xml version="1.0" encoding="utf-8"?><book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price>
</book>

3.同胞(Sibling) 拥有相同的父的节点 在下面的例子中,title、author、year以及price元素都是同胞:

<?xml version="1.0" encoding="utf-8"?><book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price>
</book>

4.先辈(Ancestor) 某节点的父、父的父,等等。 在下面的例子中,title元素的先辈是book元素和bookstore元素:

<?xml version="1.0" encoding="utf-8"?><bookstore><book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price>
</book></bookstore>

5.后代 某个节点的子,子的子,等等。 在下面的例子中,bookstore的后代是book、title、author、year以及price元素:

<?xml version="1.0" encoding="utf-8"?><bookstore><book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price>
</book></bookstore>

什么是XPath?

XPath(XML Path Language)是一门在XML文档中查找信息的语言,可用来在XML中对元素和属性进行遍历。

W3School官方文档:http://www.w3school.com.cn/xpath/index.asp

XPath 开发工具

  1. 开源的XPath表达式编辑工具:XML Quire(XML格式文件可用)
  2. Chrome插件Xpath Helper
  3. Firefox插件Xpath Checker

选取节点

XPath使用路径表达式来选取XML文档中的节点或者节点集。这些路径表达式和我们常规的电脑文件系统中看到的表达式非常相似。 下面列出了最常用的路径表达式:

表达式描述
nodename选取此节点的所有子节点
/从根节点选取
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.选取当前节点。
选取当前节点的父节点
@选取属性

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式描述
bookstore选取bookstore元素的所有子节点。
/bookstore选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book选取属于bookstore的子元素的所有book元素
//book选取所有book子元素,而不管它们在文档中的位置
bookstore//book选择属于bookstore元素的后代的所有bok元素,而不管它们位于bookstore之下的什么位置
//@lang选取名为lang的所有属性。

谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个特定的值的节点,被嵌在方括号中。 在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式结果
/bookstore/book[1]选取属于bookstore子元素的第一个book元素。
/bookstore/book[last()]选取数据bookstore子元素的最后一个book元素
/bookstore/book[last()-1]选取属于bookstore元素的倒数第二个book元素
/bookstore/book[position()❤️]选取最前面的两个属于bookstore元素的子元素book元素
//title[@lang]选取所有拥有名为lang的属性的title元素
//title[@lang=“eng”]选取所有title元素,且这些元素拥有值为eng的lang属性
/bookstore/book[price>35.00]选取所有bookstore元素的book元素,且其中的price元素的值必须大于35.00
/bookstore/book[price>35.00]/title选取bookstore元素中的book元素的所有title元素,且其中的price元素的值必须大于35.00

选取未知节点

XPath通配符可用来选取未知的XML元素。

通配符描述
*匹配任何元素节点
@*匹配任何属性节点
node()匹配任何类型的节点

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式结果
/bookstore/*选取bookstore元素的所有子元素
//*选取文档中的所有元素
title[@*]选取所有带属性的title元素

选取若干路径

通过在路径表达式中使用"|"运算符,您可以选取若干个路劲。 实例 在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式结果
‘//book/title | //book/price’选取book元素的所有title和price元素。
//title &#124 //price选取文档中的所有title和price元素
/bookstore/book/title | //price选取属于bookstore元素的book元素的title元素,以及文档中的所有price元素

XPath的运算符

xpath运算符

以上就是XPath的语法内容,在运用到Python抓取时要先转换为xml.

lxml库

lxml是一个HTML/XML的解析器,主要的功能是如何提取和解析HTML/XML数据。 lxml和正则一样,也是用C实现,是一款高性能的Python HTML/XML解析器,我们可以利用之前学习的XPath语法,来快速的定位特定元素以及节点信息。 lxml python官方文档:http://lxml.de/index.html 需要安装C语言库,可使用pip安装:pip install lxml(或通过wheel方式安装)

初步使用

我们利用它来解析HTML代码,简单实例:

#-*- coding:utf-8 -*-
#lxml_test.py#使用lxml的etree库
from lxml import etreetext = '''
<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-inactive"><a href="link3.html">third item</a></li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a> # 注意,此处缺少一个 </li> 闭合标签</ul></div>
'''#利用etree.HTML,将字符串解析为HTML文档
html = etree.HTML(text)#按字符串序列化为HTML文档
result = etree.tostring(html)print(result)

输出结果:

<html><body>
<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-inactive"><a href="link3.html">third item</a></li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li>
</ul></div>
</body></html>

lxml可以自动修正html代码,例子里不仅补全里li标签,还添加了body/html标签

文件读取:

除了直接读取字符串,lxml还支持从文件里读取内容。我们新建一个hello.html文档:

<!--hello.html-->
<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul>
</div>

再利用etree.parse()方法来读取文件。

#lxml_parse.py
from lxml import etree#读取外部文件hello.html
html = etree.parse('./hello.html')
result = etree.tostring(html, pretty_print=True)print(result)

输出结果与之前相同:

<html><body>
<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-inactive"><a href="link3.html">third item</a></li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li>
</ul></div>
</body></html>

XPath实例测试

1.获取所有的<li>标签

#xpath_li.pyfrom lxml import etreehtml = etree.parse('hello.html')
print type(html) #显示etree.parse()返回类型result = html.xpath('//li')print result  #打印<li>标签的的元素集合
print len(result)
print type(result)
print type(result[0])

输出结果:

<type 'lxml.etree._ElementTree'>
[<Element li at 0x1014e0e18>, <Element li at 0x1014e0ef0>, <Element li at 0x1014e0f38>, <Element li at 0x1014e0f80>, <Element li at 0x1014e0fc8>]
5
<type 'list'>
<type 'lxml.etree._Element'>

2.继续获取<li>标签的所有class属性

#xpath_li.py
from lxml import etreehtml = etree.parse('htllo.html')
result = html.xpath('//li/@class')print result

运行结果:

['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']

3.继续获取<li>标签下hreflink1.html<a>标签

#xpath_li.py
from lxml import etreehtml = etree.parse('hello.html')
result = html.xpath('//li/a[@href="link1.html"]')print result

运行结果:

[<Element a at 0x10ffaae18>]

4.获取<li>标签下的所有<span>标签

#xpath_li.pyfrom lxml import etreehtml = etree.parse('hello.html')#result = html.xpath('//li/span')
#注意这么写是不对的#因为/是用来获取子元素的,而<span>不是<li>的子元素,所以,要用双斜杠result = html.xpath('//li//span')print result

运行结果:

[<Element span at 0x10d698e18>]

5.获取<li>标签下的<a>标签里的所有class

from lxml import etreehtml = etree.parse('hello.html')result = html.xpath('//li/a//@class')print result

运行结果

['blod']

6.获取最后一个<li><a>的href

#xpath_li.pyfrom lxml import etreehtml = etree.parse('hello.html')result = html.xpath('//li[last()]/a/@href')
#谓语[last()]可以找到最后一个元素print result

运行结果

['link5.html']

7.获取倒数第二个元素的内容

#xpath_li.py
from lxml import etreehtml = etree.parse('hello.html')result = html.xpath('//li[last()-1]/a')#text方法可以获取元素内容
print(result[0].text)

运行结果

fourth item

8.获取class值为bold的标签名

#xpath_li.pyfrom lxml import etreehtml = etree.parse('hello.html')result = html.xpath('//*[@class="bold"]')#tag方法可以获取标签名
print result[0].tag

运行结果

span

更多Python的学习资料可以扫描下方二维码无偿领取!!!

1)Python所有方向的学习路线(新版)

总结的Python爬虫和数据分析等各个方向应该学习的技术栈。

在这里插入图片描述

比如说爬虫这一块,很多人以为学了xpath和PyQuery等几个解析库之后就精通的python爬虫,其实路还有很长,比如说移动端爬虫和JS逆向等等。

img

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然达不到大佬的程度,但是精通python是没有问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/90739.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前后端分离------后端创建笔记(06)新增接口页面布局

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

【C++精华铺】6.C++类和对象(下)类与对象的知识补充及编译器优化

目录 1. 再谈构造 1.1 成员变量的初始化&#xff08;初始化列表&#xff09; 1.2 初始化列表的行为 1.3 explicit关键字 2. 类中的static成员 2.1 静态成员变量 2.2 静态成员函数 3. 友元 3.1 友元函数 3.1 友元类 4. 内部类 5. 匿名对象 6. 对象拷贝时候的编译器优化…

C++入门基础(万字详解!!!)

文章目录 前言1.C关键字2.命名空间3.C的输入输出4.缺省参数4.1 全缺省4.2 半缺省 5.函数重载6. 引用6.1 引用的特性6.2 引用的使用场景6.3 引用和指针 7.内联函数7.1 特性 8.auto关键字8.1 注意事项 9. 基于范围的for循环9.1 使用条件 10.指针控制nullptr10.1 注意事项 11.总结…

并发编程面试题2

并发编程面试题2 一、AQS高频问题&#xff1a; 1.1 AQS是什么&#xff1f; AQS就是一个抽象队列同步器&#xff0c;abstract queued sychronizer&#xff0c;本质就是一个抽象类。 AQS中有一个核心属性state&#xff0c;其次还有一个双向链表以及一个单项链表。 首先state…

8.15黄金能否跌破千九?日内如何稳健布局

近期有哪些消息面影响黄金走势&#xff1f;黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周二&#xff08;8月15日&#xff09;亚洲时段&#xff0c;现货黄金延续低位徘徊&#xff0c;目前交投于1906.01美元/盎司附近&#xff0c;美国财长称耶伦称美国经济处于…

Linux与安卓安全对抗

导读大家都知道安卓是基于Linux内核&#xff0c;而且大家也知道Linux的安全性是公认的&#xff0c;那为什么和Linux有着类似嫡系关系的安卓却一直被人诟病不安全呢&#xff1f;要想说清楚这个问题&#xff0c;我们需要了解一下安卓和Linux到底是什么关系&#xff0c;而且这两个…

4WRZ25E3-220-5X/6A24NZ4/D3M不带位移反馈比例阀放大器

该先导阀是一个由比例电磁铁控制的三通减压阀&#xff0c;它的作用是将一个输入信号转化为一个与其成比例的压力输出信号&#xff0c;可用于所有的4WRZ...和5WRZ...型比例阀的控制。比例电磁铁是可调试&#xff0c;湿式直流电磁铁结构&#xff0c;带中心螺纹&#xff0c;线圈可…

机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?

一、引言 在实际应用中&#xff0c;特征选择作为机器学习和数据挖掘领域的重要环节&#xff0c;对于提高模型性能和减少计算开销具有关键影响。特征选择是从原始特征集中选择最相关和最具区分力的特征子集&#xff0c;以提高模型的泛化能力和可解释性。 特征选择在实践中具有以…

快手商品详情数据API 抓取快手商品价格、销量、库存、sku信息

快手商品详情数据API是用来获取快手商品详情页数据的接口&#xff0c;请求参数为商品ID&#xff0c;这是每个商品唯一性的标识。返回参数有商品标题、商品标题、商品简介、价格、掌柜昵称、库存、宝贝链接、宝贝图片、商品SKU等。 接口名称&#xff1a;item_get 公共参数 名…

【JavaEE进阶】SpringBoot 日志

文章目录 一. 日志有什么用?二. 自定义日志打印1. 日志的使用与打印 三. 日志级别1. 日志级别有什么用?2. 日志级别的分类及使用 四. 日志持久化五. 更简单的日志输出---Lombok1. Lombok的使用2. lombok原理解释2.1 Lombok更多注解说明 一. 日志有什么用? 在Java中&#xf…

SpringSecurity结合电商项目

pom <!--SpringSecurity及JWT依赖配置--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</ artifactId></dependency> <!--Hutool Java工具包--> <dependency>&l…

Vue3组件库

Vue组件库 ViteVue3TypescriptTSX 1、项目搭建 1.1、创建项目&#xff08;yarn&#xff09; D:\WebstromProject>yarn create vite yarn create v1.22.19 [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... [4/4] Building fresh pa…

idea报错:java: 程序包org.springframework.web.bind.annotation不存在

这个错误通常都是maven仓库的问题&#xff0c;试了网上很多方法&#xff0c;都没有解决&#xff0c;如果大家有遇到这个问题&#xff0c;且试了很多方法之后都没有解决&#xff0c;不妨可以试试我这个方法 先编译一下已经写好的代码&#xff0c;这时候会出现以上报错&#xff…

文本分类实战-NLP

数据集及任务分析 项目主题&#xff1a;新闻的主题分类&#xff0c;10分类任务 一般对于NLP项目来说的话需要进行数据预处理的&#xff0c;但是由于本项目的数据是经过处理过的&#xff0c;所以就不需要进行数据预处理了&#xff0c;但是数据预处理对NLP项目是重中之重的。 TH…

Linux上安装温度监控软件

文章目录 Linux上安装温度监控软件IDRAC设置 Linux上安装温度监控软件 服务器的温度是影响服务器性能重要条件&#xff0c;怎么监控机器的温度呢&#xff0c;这里知道的有两种方式 通过管理界面&#xff0c;查看机器的温度通过机器上安装监监控软件来监控温度 在物理机上怎么…

微软电脑surface键盘无法使用问题解决

昨天下班后&#xff0c;正常关掉电脑&#xff0c;今天来上班发现键盘无法使用了 打人工找到了解决方法 开机->到锁屏页面->使用屏幕键盘输入密码进入电脑 然后右键左下角的win图标 找到设备管理器->键盘 全部右键卸载 再找到设备管理->系统设备 把这个DTX也卸…

腾讯云国际站代充-阿里云ECS怎么一键迁移到腾讯云cvm?

今天主要来介绍一下如何通过阿里云国际ECS控制台一键迁移至腾讯云国际CVM。腾讯云国际站云服务器CVM提供全面广泛的服务内容。无-需-绑-定PayPal&#xff0c;代-充-值腾讯云国际站、阿里云国际站、AWS亚马逊云、GCP谷歌云&#xff0c;官方授权经销商&#xff01;靠谱&#xff0…

【Microsoft 支持】【数据库-MySql】当您尝试从大于 5000 的 TCP 端口连接时收到错误 WSAENOBUFS (10055)

​ 一、转载原文 When you try to connect from TCP ports greater than 5000 you receive the error ‘WSAENOBUFS (10055)’ Symptoms If you try to set up TCP connections from ports that are greater than 5000, the local computer responds with the following WSAE…

大数据-玩转数据-Flink网页埋点PV统计

一、说明 衡量网站流量一个最简单的指标&#xff0c;就是网站的页面浏览量&#xff08;Page View&#xff0c;PV&#xff09;。用户每次打开一个页面便记录1次PV&#xff0c;多次打开同一页面则浏览量累计。 一般来说&#xff0c;PV与来访者的数量成正比&#xff0c;但是PV并不…

QT:自定义控件(Connect使用,子控件连接)

自定义控件封装&#xff1a; 1.添加新文件&#xff08;设计师界面类&#xff09;&#xff0c;创建子页面 &#xff0c;放自己想要的控件 2.在主页面中使用子控件 :新建一个widget-![在这里插入图片描述](https://img-blog.csdnimg.cn/95ed8015343e4c56a3914853950eff4c.png#pi…