HTML示例代码:

text = '''
<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>
</ul>
</div>
'''

在 XPath 语境中,XML 文档被视作节点树,节点树的根节点也被称作文档节点。XPath 将节点树中的节点(Node)分为七类:元素(Element),属性(Attribute),文本(Text),命名空间(Namespace),处理指令(Processing-instruction),注释(Comment)和文档节点(Document nodes)。

节点之间的关系

父(Parent):每个元素都肯定有一个父节点,最顶层的元素父亲是根节点。同理每个属性必然有一个父,它们的父是元素。上文HTML 文档中,根 div 是元素 ul 的父节点,ul是元素 li的父节点,lie是元素a的父节点。

子(Children):元素可以有零或多个子。上文 HTML文档中,ul是 div的子节点。

同胞(Sibling):父节点相同的节点之间互为同胞,也称彼此的兄弟节点。

先辈(Ancestor):某节点的父节点、父的父,以此类推一直追溯至根节点之间所有节点。上文 HTML文档中,div、ul是li的先辈。

后代(Descendant):某节点的子节点、子的子,以此类推至最后一个子节点之间所有节点。上文 HTML文档中,ul、li是div的后代。

利用etree库读取网页源代码

# 导入 lxml etree 库
from lxml import etree # 获取 html 内容 元素
htmlEmt = etree.HTML(text)

如果源码保存在文件中,可用parse 方法来读取文件。

from lxml import etree
# text.xml 是一个 xml 文件,并在当前文件同目录下
htmlEmt = etree.parse('text.xml')

#lxml 有自动修正 HTML 代码的功能

Xpath选取节点

预判(Predicates):预判是用来查找某个特定的节点或者符合某种条件的节点,预判表达式位于方括号中。

通配符:

或条件选取:使用 “|” 运算符,你可以选取符合“或”条件的若干路径。

附录:

XPATH返回的不一定就是唯一的节点,而是符合条件的所有节点。比如在HTML文档里使用“/html/head/scrpt”就会把head里的所有script节点都取出来。为了缩小定位范围,往往还需要增加过滤条件。过滤的方法就是用“[”“]”把过滤条件加上。比如在HTML文档里使用“/html/body/div[@id='main']”,即可取出body里id为main的div节点。其中@id表示属性id,类似的还可以使用如@name, @value, @href, @src, @class….而函数text()的意思则是取得节点包含的文本。比如:<div>hello<p>world</p>< /div>中,用”div[text()='hello']“即可取得这个div,而world则是p的text()。

函数position()的意思是取得节点的位置。比如“li[position()=2]”表示取得第二个li节点,它也可以被省略为“li[2]”。不过要注意的是数字定位和过滤 条件的顺序。比如“ul/li[5][@name='hello']”表示取ul下第五项li,并且其name必须是hello,否则返回空。而如果用 “ul/li[@name='hello'][5]”的意思就不同,它表示寻找ul下第五个name为”hello“的li节点。

此外,“*”可以代替所有的节点名,比如用”/html/body/*/span”可以取出body下第二级的所有span,而不管它上一级是div还是p或是其它什么东东。

爬虫笔记(十三)——lxml库的使用的更多相关文章

  1. python爬虫笔记----4.Selenium库(自动化库)

    4.Selenium库 (自动化测试工具,支持多种浏览器,爬虫主要解决js渲染的问题) pip install selenium 基本使用 from selenium import webdriver ...

  2. PYTHON 爬虫笔记七:Selenium库基础用法

    知识点一:Selenium库详解及其基本使用 什么是Selenium selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium ...

  3. PYTHON 爬虫笔记五:BeautifulSoup库基础用法

    知识点一:BeautifulSoup库详解及其基本使用方法 什么是BeautifulSoup 灵活又方便的网页解析库,处理高效,支持多种解析器.利用它不用编写正则表达式即可方便实现网页信息的提取库. ...

  4. PYTHON 爬虫笔记三:Requests库的基本使用

    知识点一:Requests的详解及其基本使用方法 什么是requests库 Requests库是用Python编写的,基于urllib,采用Apache2 Licensed开源协议的HTTP库,相比u ...

  5. PYTHON 爬虫笔记六:PyQuery库基础用法

    知识点一:PyQuery库详解及其基本使用 初始化 字符串初始化 html = ''' <div> <ul> <li class="item-0"&g ...

  6. PYTHON 爬虫笔记二:Urllib库基本使用

    知识点一:urllib的详解及基本使用方法 一.基本介绍 urllib是python的一个获取url(Uniform Resource Locators,统一资源定址器)了,我们可以利用它来抓取远程的 ...

  7. python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容

    python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...

  8. python 3.x 爬虫基础---常用第三方库(requests,BeautifulSoup4,selenium,lxml )

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 python 3.x 爬虫基础---常用第三方库 ...

  9. python简单爬虫 用lxml库解析数据

    目标:爬取湖南大学2018年本科招生章程 url:http://admi.hnu.edu.cn/info/1026/2993.htm 页面部分图片: 使用工具: Python3.7 火狐浏览器 PyC ...

随机推荐

  1. Python中的常用内置对象之range对象

    range(start, stop[, step])  可生成满足条件的数.具体来说是返回一个从start开始到小于stop的相邻数的差step的等差数列列表.结果中包含start一直到小于stop的 ...

  2. (一)IOC基础推导及理论

    环境准备:见java环境搭建,新建maven项目 1.写一个UserDao接口 public interface UserDao { public void getUser(); } 2.再写Dao的 ...

  3. MySQL新增数据,存在就更新,不存在就添加

    1.插入一条数据,存在就更新,不存在就更新(必须现有唯一键)使用insert ignore语句: insert ignore into table(col1,col2) values ('a','b' ...

  4. 二十六、CI框架之分页

    一.在模型中读取数据库中的表 二.在控制器中添加dividePage函数 三.在View中写入显示代码 四.查看效果,还是挺漂亮的分页效果 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信 ...

  5. poj_3461 KMP算法解析

    A - Oulipo Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit S ...

  6. bugku-Web-多次(异或注入,判断被过滤的关键字)

    进去看到url感觉是sql注入, 加上',报错但是%23不报错,加上'--+,也不报错,说明可以用--+注释 加上' or 1=1--+,报错 尝试' oorr 1=1--+,正常 说明or被过滤了. ...

  7. docker入门资料及常用命令

      Docker17中文开发手册 :https://www.php.cn/manual/view/36147.html   Linux部署Docker及常用命令: https://www.cnblog ...

  8. 不同的二叉搜索树&II

    不同的二叉搜索树 只要求个数,递推根节点分割左右子树即可 class Solution { public int numTrees(int n) { int []dp=new int[n+1]; fo ...

  9. redis常用命令--strings

    strings常用命令: set key value:存值 get key:取值 append key value:在值后追加值 strlen key:获取长度 mset key1 value1 ke ...

  10. Java 创建对象的几种方式

    转自https://www.cnblogs.com/wxd0108/p/5685817.html 作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而 ...