博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
xpath beautiful pyquery三种解析库
阅读量:4325 次
发布时间:2019-06-06

本文共 3219 字,大约阅读时间需要 10 分钟。

这两天看了一下python常用的三种解析库,写篇随笔,整理一下思路。太菜了,若有错误的地方,欢迎大家随时指正。。。。。。。(conme on.......)

爬取网页数据一般会经过 获取信息->提取信息->保存信息 这三个步骤。而解析库的使用,则可以帮助我们快速的提取出我们需要的那被部分信息,免去了写复杂的正则表达式的麻烦。在使用解析库的时候,个人理解也会有三个步骤 建立文档树->搜索文档树->获取属性和文本 。

建立文档树:就是把我们获取到的网页源码利用解析库进行解析,只有这样,后面才能使用这个解析库的方法。

搜索文档树:就是在已经建立的文档树里面,利用标签的属性,搜索出我们需要的那部分信息,比如一个包含一部分网页内容的div标签,一个ul标签等。

获取索性和文本:在上一步的基础上,进一步获取到具体某个标签的文本或属性,比如一个a标签的href属性,title属性,或它的文本。

首先,定义一个html的字符串,用它来模拟已经获取到的网页源码

View Code

 

xpath解析库:XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言。它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索。

1.建立文档树:在获取到网页源码后,只需要使用etree的HTML方法,就可以把复杂的html建立成 一棵文档树了

from lxml import etreexpath_tree = etree.HTML(html)

 

这里首先导入lxml库的etree模块,然后声明了一段HTML文本,调用HTML类进行初始化,这样就成功构造了一个XPath解析对象。可以使用type查看一下xpath_tree的类型,是这样的 <class 'lxml.etree._Element'>

2.搜索文档树:先看一下xpath几个常用的规则

(1)从整个文档树中搜索标签:一般会用//开头的XPath规则来选取所有符合要求的节点。这里以前面的HTML文本为例。例如搜索 ul 标签

1 xpath_tree = etree.HTML(html)2 result = xpath_tree.xpath('ul')3 print(result)4 print(type(result))5 print(type(result[0])) 输出结果如下: [
,
]

 

上面第二行代码表示从整个文档树中搜索出所有的ul标签,可以看到,返回结果是一个列表,里面的每个元素都是lxml.etree._Element类型,当然,也可以对这个列表进行一个遍历,然后对每个lxml.etree._Element对象进行操作。

(2)搜索当前节点的子节点:比如,找到每一个ul标签里面的 li 标签:

1 xpath_tree = etree.HTML(html)2 result = xpath_tree.xpath('//ul')3 for r in result:4     li_list = r.xpath('./li')5     print(li_list) 输出结果如下: [
,
,
,
,
] [
,
,
,
,
]

 

第四行代码表示,选取当前的这个ul标签,并获取到它里面的所有li标签。

(3)根据属性过滤:如果你需要根据标签的属性进行一个过滤,则可以这样来做

1 xpath_tree = etree.HTML(html)2 result = xpath_tree.xpath('//ul')3 for r in result:4     li_list = r.xpath('./li[@class="item-0"]')5     print(li_list) 输出结果如下: [
,
] [
,
]

 

与之前的代码相比,旨在第四行的后面加了 [@class="item-0"] ,它表示找到当前ul标签下所有class属性值为item-0的li标签,当然,也可以在整个文档树搜索某个标签时,在标签后面加上某个属性,进行过滤,下面例子中有用到

(4)获取文本:获取具体某个标签的文本内容

1 xpath_tree = etree.HTML(html)2 result = xpath_tree.xpath('//ul[@class="list"]')3 for r in result:4     li_list = r.xpath('./li[@class="item-0"]')5     for li in li_list:6         print(li.xpath('./text()')) 输出结果如下: ['first item'] [] ['first item'] []

 

 

首先,在第二行的ul标签后面加了属性过滤,但因为两个ul标签的class属性值都是list,所以结果没加之前是一样的。然后又加了一个for循环,用来获取列表里面每一个元素的文本,因为第二个li标签里面没有文本内容,所以是空

(5)获取属性:获取具体某个标签的某个属性内容

1 xpath_tree = etree.HTML(html)2 result = xpath_tree.xpath('//ul[@class="list"]')3 for r in result:4     li_list = r.xpath('./li[@class="item-0"]')5     for li in li_list:6         print(li.xpath('./@class')) 输出结果如下: ['item-0'] ['item-0'] ['item-0'] ['item-0']

 

把第六行的text()方法换成@符号,并在后面加上想要的属性,就获取到了该属性的属性值。

这是xpath这个解析库基本的使用方法,也有一些没说到的地方,大家可以看一下静谧大佬的文章。另外两个解析库,放在后面两篇随笔里面

*************************不积跬步,无以至千里。*************************

转载于:https://www.cnblogs.com/liangxiyang/p/11302087.html

你可能感兴趣的文章
AccountManager教程
查看>>
Android学习笔记(十一)——从意图返回结果
查看>>
算法导论笔记(四)算法分析常用符号
查看>>
ultraedit激活
查看>>
总结(6)--- python基础知识点小结(细全)
查看>>
亿级曝光品牌视频的幕后设定
查看>>
ARPA
查看>>
JSP开发模式
查看>>
我的Android进阶之旅------&gt;Android嵌入图像InsetDrawable的使用方法
查看>>
Detours信息泄漏漏洞
查看>>
win32使用拖放文件
查看>>
Android 动态显示和隐藏软键盘
查看>>
raid5什么意思?怎样做raid5?raid5 几块硬盘?
查看>>
【转】how can i build fast
查看>>
null?对象?异常?到底应该如何返回错误信息
查看>>
django登录验证码操作
查看>>
(简单)华为Nova青春 WAS-AL00的USB调试模式在哪里开启的流程
查看>>
图论知识,博客
查看>>
[原创]一篇无关技术的小日记(仅作暂存)
查看>>
20145303刘俊谦 Exp7 网络欺诈技术防范
查看>>