Infi-chu:

http://www.cnblogs.com/Infi-chu/

XPath:

全称是 XML Path Language,XML路径语言,它是一门在XML文档中和HTML文档中查找信息的语言

1.XPath常用规则

表达式    描述

nodename  选取此节点的所有子节点

/        从当前节点选取直接子节点

//       从当前节点选取子孙节点

.        选取当前节点

..       选取当前节点的父节点

@        选取属性

2.准备工作:安装 lxml 库

3.例子:

from lxml import etree
text =
'''
<div>
<ul>
<li class="ex1"><a href="ex1.html">ex1</a></li>
<li class="ex2"><a href="ex2.html">ex2</a>
</ul>
</div>
'''
html = etree.HTML(text) # 调用HTML类进行html初始化工作
r = etree.tostring(html) # 修复HTML代码,补全其他选项
print(r.decode('utf-8')) # 结果返回是bytes,我们将其转化成UTF-8

4.所有节点

选取所有节点:

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
res = html.xpath('//*') # 选取所有
print(res)

5.子节点

选取li节点的所有直接a子节点:

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
res = html.xpath('//li/a')
print(res)

6.父节点

使用.和..

7.属性匹配

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
res = html.xpath('//li[@class='ex1']')
print(res)

8.文本属性

选取li节点的内部文本,两种方法,推荐第二种

a.

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
res = html.xpath('//li[@class='ex1']/a/text()')
print(res)

b.推荐,信息更全

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
res = html.xpath('//li[@class="ex1"]//text()')
print(res)

9.属性获取

获取所有li节点下所有a节点的href属性

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
res = html.xpath('//li/a/@href')
print(res)

10.属性多值匹配

from lxml import etree
text =
'''
<div>
<ul>
<li class="li li-first"><a href="ex1.html">li1</a></li>
</ul>
</div>
'''
html = etree.HTML(text)
res = html.xpath('//li[contains(@class,"li")]/a/text()')
print(res)

【注】

contains()中,

第一个参数传入属性名称,第二个参数传入属性值

11.多属性匹配

根据多个属性确定一个节点

from lxml import etree
text =
'''
<div>
<ul>
<li class="li" name="123"><a href="ex1.html">ex1</a></li>
</ul>
</div>
'''
html = etree.HTML(text)
res = html.xpath('//li[@contains(@class,"li") and @name="123"]/a/text()')
print(res)

12.按序选择(多个节点)

from lxml import etree
text =
'''
<div>
<ul>
<li class="ex1"><a href="ex1.html">ex1</a></li>
<li class="ex2"><a href="ex2.html">ex2</a></li>
<li class="ex3"><a href="ex3.html">ex3</a></li>
</ul>
</div>
'''
html = etree.HTML(text)
res = html.xpath('//li[1]/a/text()') # 第一个li
res = html.xpath('//li[last()]/a/text()') # 最后一个li
res = html.xpath('//li[position()<3]/a/text()') # 前两个li
res = html.xpath('//li[last()-2]/a/text()') # 第一个li

【注】

序号从1开始

13.节点轴选择

from lxml import etree
text =
'''
<div>
<ul>
<li class="ex1"><a href="ex1.html">ex1</a></li>
<li class="ex2"><a href="ex2.html">ex2</a></li>
<li class="ex3"><a href="ex3.html">ex3</a></li>
</ul>
</div>
'''
html = etree.HTML(text)
res = html.xpath('//li[1]/ancestor::*') # 获取祖先节点
res = html.xpath('//li[1]/ancestor::div') # 获取祖先div节点
res = html.xpath('//li[1]/attribute::*') # 所有属性值
res = html.xpath('//li[1]/child::a[href="ex1.html"]') # 所有直接子节点
res = html.xpath('//li[1]/descendant::span') # 所有子孙节点
res = html.xpath('//li[1]/following::*[2]') # 当前节点之后的所有节点
res = html.xpath('//li[1]/following-sibling::*') # 当前节点之后的所有同级节点

 【注】这些都是轴

ancestor、attribute、child、descendant、following、following-sibling

Python3爬虫(五)解析库的使用之XPath的更多相关文章

  1. 【XPath Helper:chrome爬虫网页解析工具 Chrome插件】XPath Helper:chrome爬虫网页解析工具 Chrome插件下载_教程_安装 - 开发者插件 - Chrome插件网

    [XPath Helper:chrome爬虫网页解析工具 Chrome插件]XPath Helper:chrome爬虫网页解析工具 Chrome插件下载_教程_安装 - 开发者插件 - Chrome插 ...

  2. Python爬虫【解析库之beautifulsoup】

    解析库的安装 pip3 install beautifulsoup4 初始化 BeautifulSoup(str,"解析库") from bs4 import BeautifulS ...

  3. Python爬虫【解析库之pyquery】

    该库跟jQuery的使用方法基本一样  http://pyquery.readthedocs.io/ 官方文档 解析库的安装 pip3 install pyquery 初始化 1.字符串初始化 htm ...

  4. python爬虫三大解析库之XPath解析库通俗易懂详讲

    目录 使用XPath解析库 @(这里写自定义目录标题) 使用XPath解析库 1.简介   XPath(全称XML Path Languang),即XML路径语言,是一种在XML文档中查找信息的语言. ...

  5. 爬虫之解析库-----re、beautifulsoup、pyquery

    一.介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...

  6. python3爬虫之Urllib库(一)

    上一篇我简单说了说爬虫的原理,这一篇我们来讲讲python自带的请求库:urllib 在python2里边,用urllib库和urllib2库来实现请求的发送,但是在python3种在也不用那么麻烦了 ...

  7. python爬虫之解析库Beautiful Soup

    为何要用Beautiful Soup Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式, 是一个 ...

  8. python3爬虫之Urllib库(二)

    在上一篇文章中,我们大概讲了一下urllib库中最重要的两个请求方法:urlopen()  和  Request() 但是仅仅凭借那两个方法无法执行一些更高级的请求,如Cookies处理,代理设置等等 ...

  9. python爬虫之解析库正则表达式

    上次说到了requests库的获取,然而这只是开始,你获取了网页的源代码,但是这并不是我们的目的,我们的目的是解析链接里面的信息,比如各种属性  @href  @class span  抑或是p节点里 ...

随机推荐

  1. jetbrain rider 逐渐完美了,微软要哭了么?

    2019-03-24 10:08:42 多年的vsiual studio使用经验,各种小瑕疵:到现在的visual studio是越来越大了:简直到了无法忍受境地: 每次重装系统都要重新安装下,这个不 ...

  2. Angular 5.x 学习笔记(1) - 模板语法

    Angular 5.x Template Syntax Learn Note Angular 5.x 模板语法学习笔记 标签(空格分隔): Angular Note on github.com 上手 ...

  3. Struts2学习-横切关注点

    1.建空项目 2.建包 3.建类 4.编写 package com.nf.action; import com.opensymphony.xwork2.ActionInvocation; import ...

  4. 用trie树实现输入提示功能,输入php函数名,提示php函数

    参照刘汝佳的trie树 结构体 #include "stdio.h" #include "stdlib.h" #include "string.h&q ...

  5. 将nodeList转换为数组(兼容性)

    将nodeList转换为数组(兼容性) function arrayofNodes(nodes){ var arr = null; try{ arr = Array.prototype.slice.c ...

  6. A potentially dangerous Request.Form value was detected from the client的解决办法

    网上找了这么多,这条最靠谱,记录下来,以备后用 <httpRuntime requestValidationMode="2.0"/> <pages validat ...

  7. 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)

    http://blog.csdn.net/hjf19790118/article/details/6919265 1.什么是面向对象编程(Object-Oriented Programming)? 面 ...

  8. 【luogu P1262 间谍网络】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1262 注意: 1.缩点时计算出入度是在缩完点的图上用color计算.不要在原来的点上计算. 2.枚举出入度时 ...

  9. JavaEE权限管理系统的搭建(八)--------角色的增删改

    如下图所示,添加角色的同时,要给角色分配权限菜单,关于权限数的显示,我实现了两种方式,普通方式和Ztree方式, 普通方式展示树: 主要代码部分: /** * 进入角色添加页面 * @param mo ...

  10. spring入门(三) 使用spring mvc

    1.建立project / module 新建空的project:springMvcStudy 新建module:type maven-webapp,名字mvcStudy 2.为module设置Sou ...