1. 什么是lxml

lxml是干什么的?简单的说来,lxml是帮助我们解析HTML、XML文件,快速定位,搜索、获取特定内容的Python库。我们知道,对于纯文本的HTML文件的查找可以使用正则表达式BeautifulSoup等完成。lxml也是对网页内容解析的一个库。

那么为什么要用lxml呢?据听说他比较快。我没有用来做过大项目,对解析速度理解不是很深刻。我用lxml只是因为它似乎比BeautifulSoup好用。

2. 初次使用

  1. 安装
  1. sudo pip3 install lxml
  1. 初次使用
  1. # 导入lxml
  2. from lxml import etree
  3. # html字符串
  4. html_str = """
  5. <html>
  6. <head>
  7. <title>demo</title>
  8. </head>
  9. <body>
  10. <p>1111111</p>
  11. </body>
  12. </html>
  13. """
  14. # 利用html_str创建一个节点树对象
  15. html = etree.HTML(html_str)
  16. type(html) # 输出结果为:lxml.etree._Element
  1. 首次解析HTML

不用理会下面代码中出现的新的方法和各种解析的技巧。先看一下lxml如何快速方便的解析html.

  1. # 我们现在要获得上面的html文件中的p标签的内容
  2. p_str = html.xpath('//body/p/text()') # 返回结果为一个列表:['1111111']

上面的例子,给出一个lxml如何解析HTML文件的实例。后文中众多的知识点,只不过是讲解更多的xpath解析方法技巧。

3. xpath

我们一直再讲lxml,这里突然出现xpath是干什么的?lxml的主要功能是解析HTML,他是利用什么语法来解析HTML的呢?就是利用xpath,因此,我们需要了解如何使用xpath。

xpath将html文档看做一个有众多的节点按照特定级别组织的节点树,对于其中内容的解析,又三种主要的措施:

  1. 标签定位
  2. 序列定位
  3. 轴定位

很抱歉,我们又引入了新的概念。但现在我们解释这些概念是不明智的,还是先看一下如何使用。

3.2 标签定位

为了说明xpath各种定位语法,我们下面利用如下的HTML来完成讲解。

  1. from lxml import etree
  2. html_str = """
  3. <!DOCTYPE html>
  4. <html lang="en">
  5. <head>
  6. <meta charset="UTF-8">
  7. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  8. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  9. <title>The Document's story</title>
  10. </head>
  11. <body>
  12. <div class="table1">
  13. <ul class="one" id="id1">
  14. <tr>tr1</tr>
  15. <tr>tr2</tr>
  16. <tr>tr3</tr>
  17. <tr>tr4</tr>
  18. </ul>
  19. <ol class="two" id="id2">
  20. <td>td1</td>
  21. <td>td2</td>
  22. <td>td3</td>
  23. <td>td4</td>
  24. </ol>
  25. </div>
  26. <div class="table2">
  27. <a href="www.table2_1.com"><span>table2_span</span></a>
  28. <a href="www.table2_2.com">
  29. <p><h2>TABLE2</h2></p>
  30. </a>
  31. <a href="www.table2_3.com" id="id3">
  32. <ul class="table_one" id="id4">
  33. <tr>tr1_a</tr>
  34. <tr>tr2_a</tr>
  35. <tr>tr3_a</tr>
  36. <tr>tr4_a</tr>
  37. </ul>
  38. </a>
  39. </div>
  40. </body>
  41. </html>
  42. """
  43. html = etree.HTML(html_str)
  44. html.xpath('//*') # 请将'//*'替换成下面表中实例列的表达式以观察各表达式的含义和作用。

先给出一张表。下表中给出了标签定位的表达式和对其作用的描述。下表中,实例列中的表达式的全部表达如下:如第一行中的命令为'//div',则全部的表达式为html.xpath('//div') 。注意,这里的html是一个lxml.etree._Element对象。(我们用HTML表示HTML文件或者其对应的字符串。)

表达式 描述 实例 解释
nodename 选取此节点的所有子节点 '//div' 找到html树中的所有div标签
/ 从根节点选取 '/head/title' 从根节点找到head->title
// 选取任意位置的某个节点 '//' html中所有p标签
. 选取当前节点 '.' 返回当前节点对象
.. 选取当前节点的父节点 '/html/head/..' 返回head的父节点html
@ 选取属性 '//div[@class="one"]' 返回具有属性class,并且class的值为"one"的节点
* 通配符 '//div/*' 返回所有满足条件的节点
| 一次选择多个路径 '/html/head | //div' 返回head节点或者div节点
@* 选取所有属性 '//div[@*]' 返回所有具有属性的div对象

3.3 序列定位

通过上面的学习,我们知道html.xpath()返回的是一个包含节点树对象的列表,对于列表中的元素,我们可以按照列表的索引进行查找,但是,如果想在xpath里面进行选择,就需要使用序列定位。

下面的代码承接上文。在给出一张表。

谓语 描述 实例 解释
[1] 第一个元素 '//div[1]' 返回第一个div对象
[last()] 最后一个元素 '//div[last()]' 返回最后一个div对象
[last()-1] 倒数第二个元素 '//div/ul[1]/tr[last()-1]' 返回所有div对象中第一个ul对象下面的倒数第二个tr对象
[position()❤️] 最前面的两个元素 '//tr[position()❤️]' 返回前两个tr对象
[@lang] 所有拥有属性lang的元素 '//div[@class]' 返回具有calss属性的div
[@lang='en'] 所有lang='en'的元素 '//div[@class="en"]' 返回class属性值为en的div对象

3.4 轴定位

同上。

轴名称 描述 实例 解释
child 当前节点的所有子元素 '//div[1]/child:

lxml解析网页的更多相关文章

  1. Python爬虫——使用 lxml 解析器爬取汽车之家二手车信息

    本次爬虫的目标是汽车之家的二手车销售信息,范围是全国,不过很可惜,汽车之家只显示100页信息,每页48条,也就是说最多只能够爬取4800条信息. 由于这次爬虫的主要目的是使用lxml解析器,所以在信息 ...

  2. python网络爬虫-解析网页(六)

    解析网页 主要使用到3种方法提取网页中的数据,分别是正则表达式.beautifulsoup和lxml. 使用正则表达式解析网页 正则表达式是对字符串操作的逻辑公式 .代替任意字符 . *匹配前0个或多 ...

  3. 用Xpath选择器解析网页(lxml)

    在<爬虫基础以及一个简单的实例>一文中,我们使用了正则表达式来解析爬取的网页.但是正则表达式有些繁琐,使用起来不是那么方便.这次我们试一下用Xpath选择器来解析网页. 首先,什么是XPa ...

  4. Beautiful Soup解析网页

    使用前步骤: 1.Beautiful Soup目前已经被移植到bs4,所以导入Beautiful Soup时先安装bs4库. 2.安装lxml库:如果不使用此库,就会使用Python默认的解析器,而l ...

  5. 网络爬虫之Selenium模块和Xpath表达式+Lxml解析库的使用

    实际生产环境下,我们一般使用lxml的xpath来解析出我们想要的数据,本篇博客将重点整理Selenium和Xpath表达式,关于CSS选择器,将另外再整理一篇! 一.介绍: selenium最初是一 ...

  6. bs4——BeautifulSoup模块:解析网页

    解析由requests模块请求到的网页 import requests from bs4 import BeautifulSoup headers = {'User-Agent': 'Mozilla/ ...

  7. python网络爬虫之解析网页的BeautifulSoup(爬取电影图片)[三]

    目录 前言 一.BeautifulSoup的基本语法 二.爬取网页图片 扩展学习 后记 前言 本章同样是解析一个网页的结构信息 在上章内容中(python网络爬虫之解析网页的正则表达式(爬取4k动漫图 ...

  8. python网络爬虫之解析网页的XPath(爬取Path职位信息)[三]

    目录 前言 XPath的使用方法 XPath爬取数据 后言 @(目录) 前言 本章同样是解析网页,不过使用的解析技术为XPath. 相对于之前的BeautifulSoup,我感觉还行,也是一个比较常用 ...

  9. Python爬虫解析网页的4种方式 值得收藏

    用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情. ​ 我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存 ...

随机推荐

  1. Java实现LRU算法

    一.LRU算法简介 LRU(Least Recently Used)最近最久未使用算法 常见应用场景:内存管理中的页面置换算法.缓存淘汰中的淘汰策略等 二.实现理论 底层结构:双向链表 + HashM ...

  2. NOI 2011 兔农 题解

    事先声明,本博客代码主要模仿accepoc,且仅针对一般如本博主一样的蒟蒻. 这道题不得不说数据良心,给了75分的水分,但剩下25分真心很难得到,因此我们就来讲一讲这剩下的25分. 首先,有数据可知他 ...

  3. 【深搜(DFS)-例题-踏青】-C++

    描述 小白和他的朋友周末相约去召唤师峡谷踏青.他们发现召唤师峡谷的地图是由一块一块格子组成的,有的格子上是草丛,有的是空地.草丛通过上下左右 4 个方向扩展其他草丛形成一片草地,任何一片草地中的格子都 ...

  4. Ubuntu 下载 Eclipse + tomcat 配置

    tomcat下载 去网站下载core中的 tar.gz的文件 下载之后依然转移到/opt文件夹然后进行解压 sudo cp apache-tomcat- /opt sudo tar -zxvf apa ...

  5. C#4.0新增功能04 嵌入的互操作类型

    连载目录    [已更新最新开发文章,点击查看详细] 从 .NET Framework 4 开始,公共语言运行时支持将 COM 类型的类型信息直接嵌入到托管程序集中,而不要求托管程序集从互操作程序集中 ...

  6. 《C# 语言学习笔记》——事件

    对象可以激活事件,作为它们处理的一部分.给代码添加事件处理程序,这是一种特殊的函数,在事件发生时调用.还可以配置这个处理程序,以监听我们感兴趣的事件. 使用事件可以创建事件驱动的应用程序.许多基于Wi ...

  7. typescript 公共,私有与受保护的修饰符

    public理解 当你在程序中没有指明修饰符时,默认为public,也就是在类内类外都可以访问,我们以下面的例子来解释. class Person{ name:string sex:string ag ...

  8. java的System.currentTimeMillis()和System.nanoTime

    纳秒 ns(nanosecond):纳秒, 时间单位.一秒的10亿分之一,即等于10的负9次方秒.常用作 内存读写速度的单位,其前面数字越小则表示速度越快.   1纳秒=1000 皮秒   1纳秒 = ...

  9. IDEA创建普通java和web项目教程

    1.第一个javaSE项目 01.双击idea运行IDE 02.配置JDK 03.创建项目的workspace .iml文件里面是当前项目的一些配置信息! 相当于web项目中的web.xml文件 04 ...

  10. spring使用thymeleaf

    一.spring使用thymeleaf做解析器其实很简单,这是基于xml配置的方式 <?xml version="1.0" encoding="UTF-8" ...