1. XPath

1.1 什么是XPath

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

1.2 XPath开发工具

1.2.1 Chrome插件XPath Helper

https://jingyan.baidu.com/article/1e5468f94694ac484861b77d.html

1.2.2 Firefox插件XPath Checker

https://blog.csdn.net/menofgod/article/details/75646443

1.3 Xpath语法

这个就要看我写的selenium基础中的文章了。

https://www.cnblogs.com/liuhui0308/p/11937139.html

2. lxml模块

lxml是一个HTML/XML的解析库,主要功能是如何解析和提取HTML/XML数据。

lxml和正则是一样,也是用C语言实现的,是一款高性能的Python HTML/XML解析器,可以利用之前学习的XPath语法,来快速定位特定元素以及节点信息。

可通过 pip 安装:

pip install lxml -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

2.1 基本使用

我们可以利用它来解析HTML 代码,且在解析 HTML 代码的时候,如果 HTML 代码不规范,他会自动进行补全。

from lxml.html import etree

htmlText = '''
<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(htmlText) # 按字符串序列化 HTML 文档
result = etree.tostring(html, encoding='utf-8', pretty_print=True).decode('utf-8') print(result)

2.2 在文件中读取html代码

除了直接使用字符串进行解析,lxml 还支持从文件中读取内容。

html代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title></title> </head>
<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>

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

from lxml.html import etree

html = etree.parse('./hello.html')
result = etree.tostring(html, encoding='utf-8', pretty_print=True).decode('utf-8')
print(result)

结果:

我们看到居然报错了,为什么呢?

之所以使用etree.parse()方法解析 html 内容时,会报lxml.etree.XMLSyntaxError的错,是因为etree.parse()默认使用的是XML的解析器,所以当html内容不规范,比如出现某个标签缺少闭合标签时,就会报这个错误。这时,可使用etree.HTMLParser()创建一个HTML的解析器,然后作为etree.parse()方法的参数即可。

from lxml.html import etree

htmlParser = etree.HTMLParser(encoding='utf-8')
html = etree.parse('./hello.html', parser=htmlParser)
result = etree.tostring(html, encoding='utf-8', pretty_print=True).decode('utf-8')
print(result)

2.3 在lxml中使用XPath语法

使用XPath语法,应该使用Element.xpath语法,来执行XPath的选择。

xpath函数返回的永远是一个列表。

我们先来匹配下li标签和a标签

from lxml.html import etree

htmlParser = etree.HTMLParser(encoding='utf-8')
html = etree.parse('./hello.html', parser=htmlParser) lis = html.xpath('//li')
for li in lis:
print(etree.tostring(li, encoding='utf-8', pretty_print=True).decode('utf-8'), end='') aList = html.xpath('//a/@href')
for a in aList:
print(a)

获得li标签下a标签的href属性和内容:

from lxml.html import etree

htmlParser = etree.HTMLParser(encoding='utf-8')
html = etree.parse('./hello.html', parser=htmlParser) lis = html.xpath('//li')
for li in lis:
# . 号表示在当前的 li 元素下去匹配
href = li.xpath('.//a/@href')[0] #获取 a 标签的 href 属性
txt = li.xpath('.//a/text()')[0] #获取 a 标签的文本
print(href, txt)

爬虫(六):XPath、lxml模块的更多相关文章

  1. 洗礼灵魂,修炼python(71)--爬虫篇—【转载】xpath/lxml模块,爬虫精髓讲解

    Xpath,lxml模块用法 转载的原因和前面的一样,我写的没别人写的好,所以我也不浪费时间了,直接转载这位崔庆才大佬的 原帖链接:传送门 以下为转载内容: --------------------- ...

  2. Python爬虫基础——XPath语法的学习与lxml模块的使用

    XPath与正则都是用于数据的提取,二者的区别是: 正则:功能相对强大,写起来相对复杂: XPath:语法简单,可以满足绝大部分的需求: 所以,如果你可以根据自己的需要进行选择. 一.首先,我们需要为 ...

  3. Python爬虫 XPath语法和lxml模块

    XPath语法和lxml模块 什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. X ...

  4. lxml模块(应用xpath技术)

    一.lxml介绍 第三方库lxml是第一款表现出高性能特征的python xml库,天生支持Xpath1.0.XSLT1.0.定制元素类,甚至python风格的数据绑定接口.lxml是通过Cpytho ...

  5. python爬虫网页解析之lxml模块

    08.06自我总结 python爬虫网页解析之lxml模块 一.模块的安装 windows系统下的安装: 方法一:pip3 install lxml 方法二:下载对应系统版本的wheel文件:http ...

  6. XPath语法和lxml模块

    XPath语法和lxml模块 什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. X ...

  7. 爬虫学习笔记(六)PyQuery模块

    PyQuery模块也是一个解析html的一个模块,它和Beautiful Soup用起来差不多,它是jquery实现的,和jquery语法差不多,会用jquery的人用起来就比较方便了. Pyquer ...

  8. python3爬虫lxml模块的安装

    1:在下载lxml之前,要先查看python的版本信息, 在CMD命令行输入python 再输入import pip; print(pip.pep425tags.get_supported()) -- ...

  9. 【爬虫入门手记03】爬虫解析利器beautifulSoup模块的基本应用

    [爬虫入门手记03]爬虫解析利器beautifulSoup模块的基本应用 1.引言 网络爬虫最终的目的就是过滤选取网络信息,因此最重要的就是解析器了,其性能的优劣直接决定这网络爬虫的速度和效率.Bea ...

随机推荐

  1. [折腾笔记] 洛谷P1149-火柴棒等式 AC记

    原题链接: https://www.luogu.org/problem/P1149 题面简述: 给你n根火柴棍,你可以拼出多少个形如"A+B=C""A+B=C" ...

  2. 解密面试中的套路,你都get到了么?

    如果大家有关注一些测试类的公众号或者论坛的话,肯定会发现很多文章都在表示现在行业的寒冬冷潮来了!然后有很多测试行业从业者,或者转行测试行业者都表示:工作好难找,公司跑了千千万,依然拿不到一个offer ...

  3. Spring Boot通过ImportBeanDefinitionRegistrar动态注入Bean

    在阅读Spring Boot源码时,看到Spring Boot中大量使用ImportBeanDefinitionRegistrar来实现Bean的动态注入.它是Spring中一个强大的扩展接口.本篇文 ...

  4. MySQL详解

    MySQL详解 什么是数据库 # 用来存储数据的仓库 # 数据库可以在硬盘及内存中存储数据 # 数据库与文件存储数据区别 # 数据库本质也是通过文件来存储数据, 数据库的概念就是系统的管理存储数据的文 ...

  5. Error creating bean with name 'entityManagerFactory' defined in class path resource解决方案

    ​ 项目是集成了Spring Boot和Spring Data,然后昨天简单Jpa和Spring Boot配置完成,开始进行公司项目的重构,然后出现了这个问题.当时是在网上找了好久.后来发现时java ...

  6. Netty学习——Netty和Protobuf的整合(一)

    Netty学习——Netty和Protobuf的整合 Protobuf作为序列化的工具,将序列化后的数据,通过Netty来进行在网络上的传输 1.将proto文件里的java包的位置修改一下,然后再执 ...

  7. vue中,使用element ui的弹窗与echarts之间的问题

    今天项目中有个需求,就是在页面中点击一个图标,弹出一个抽屉式的弹窗(弹窗是element UI的抽屉),弹窗里边是echarts呈现的数据,当我直接用echarts的时候,报错dom没有获取到: 这就 ...

  8. 从零开始openGL—— 二、 基本图形绘制

    前言 这是从零开始openGL系列文章的第二篇,在上篇文章中介绍了基本的环境配置,这篇文章将介绍如何绘制基本图形(圆.三角形.立方体.圆柱.圆锥). 基本框架 下面这里我先给出opengl的3D绘图的 ...

  9. 转:spring aop 拦截业务方法,实现权限控制

    难点:aop类是普通的java类,session是无法注入的,那么在有状态的系统中如何获取用户相关信息呢,session是必经之路啊,获取session就变的很重要.思索很久没有办法,后来在网上看到了 ...

  10. WebSSH画龙点睛之lrzsz上传下载文件

    本篇文章没有太多的源码,主要讲一下实现思路和技术原理 当使用Xshell或者SecureCRT终端工具时,我的所有文件传输工作都是通过lrzsz来完成的,主要是因为其简单方便,不需要额外打开sftp之 ...