首页 技术 正文
技术 2022年11月14日
0 收藏 999 点赞 3,893 浏览 1786 个字

HTML示例代码:

text = '''
<div>
<ul>
<li class="item-0"><a href="link1.html" rel="external nofollow" >first item</a></li>
<li class="item-1"><a href="link2.html" rel="external nofollow" >second item</a></li>
<li class="item-inactive"><a href="link3.html" rel="external nofollow" >third item</a></li>
<li class="item-1"><a href="link4.html" rel="external nofollow" >fourth item</a></li>
<li class="item-0"><a href="link5.html" rel="external nofollow" >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或是其它什么东东。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,494
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295