当前位置: 首页 > 后端技术 > Python

Python解析库lxml和xpath使用总结

时间:2023-03-26 14:11:59 Python

本文主要介绍xpath和lxml库:1.xpath概念、xpath节点、xpath语法、xpath轴、xpath运算符2.lxml安装、lxml使用、lxml案例1.xpath1.xpath的概念XPath是一种用于在XML文档中查找信息的语言。XPath使用路径表达式在XML文档中导航。XPath包括一个标准函数库。XPath是XSLT中的主要元素。XPath是W3C标准。2.xpath节点xpath有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释和文档(根)节点。节点关系:父亲、儿子、兄弟、祖先、后代。3.xpath语法xpath语法在W3c网站上有详细介绍,这里截取一些知识供大家学习。XPath使用路径表达式来选择XML文档中的节点。通过以下路径或步骤选择节点。下面列出了最有用的路径表达式:表达式描述nodename选择该节点的所有子节点。/从根节点选择。//从匹配选择的当前节点中选择文档中的节点,无论它们的位置如何。.选择当前节点。..选择当前节点的父节点。@pick属性。在下表中我们列出了一些路径表达式及其结果:路径表达式结果bookstore选择bookstore元素的所有子节点。/bookstore选择根元素书店。注意:如果路径以正斜杠(/)开头,则路径始终表示元素的绝对路径!bookstore/book选择作为bookstore子元素的所有book元素。//book选择所有book子元素,无论它们在文档中的位置如何。bookstore//book选择作为bookstore元素后代的所有book元素,无论它们位于bookstore下的哪个位置。//@lang选择所有名为lang的属性。谓词用于查找特定节点或包含指定值的节点。谓词括在方括号中。在下表中,我们列出了一些带有谓词的路径表达式,表达式的结果:pathexpressionresult/bookstore/book[1]选择作为bookstore子元素的第一个book元素。/bookstore/book[last()]选择作为bookstore子元素的最后一个book元素。/bookstore/book[last()-1]选择作为bookstore子元素的倒数第二个book元素。/bookstore/book[position()<3]选择作为bookstore元素子元素的前两个book元素。//title[@lang]选择所有具有名为lang的属性的标题元素。//title[@lang='eng']选择所有lang属性值为eng的标题元素。/bookstore/book[price>35.00]选取bookstore元素的所有book元素,price元素的值必须大于35.00。/bookstore/book[price>35.00]/title选取bookstore元素中book元素的所有title元素,price元素的值必须大于35.00。选择未知节点XPath通配符可用于选择未知的XML元素。通配符描述*匹配任何元素节点。@*匹配任何属性节点。node()匹配任何类型的节点。在下表中我们列出了一些路径表达式,以及它们的结果:路径表达式结果/bookstore/*选择bookstore元素的所有子元素。//*选择文档中的所有元素。//title[@*]选择所有有属性的title元素。选择多个路径您可以使用“|”选择多个路径路径表达式中的运算符。在下表中我们列出了一些路径表达式,以及这些表达式的结果:路径表达式结果//book/title//book/price选择了book元素的所有title和price元素。//title//price选择文档中的所有标题和价格元素。/bookstore/book/title//price选取bookstore元素中属于book元素的所有title元素,以及document中的所有price元素。4.xpath轴可以定义相对于当前节点的节点集。axisnameresultancestor选择当前节点的所有祖先(父、祖父母等)。ancestor-or-self选择当前节点的所有祖先(父母、祖父母等)以及当前节点本身。attribute选择当前节点的所有属性。child选择当前节点的所有子元素。descendant选择当前节点的所有后代元素(子元素、孙元素等)。descendant-or-self选择当前节点的所有后代元素(子元素、孙元素等)以及当前节点本身。following选择文档中当前节点结束标记之后的所有节点。namespace选择当前节点的所有命名空间节点。parent选择当前节点的父节点。preceding选择文档中当前节点开始标记之前的所有节点。preceding-sibling选择当前节点之前的所有兄弟节点。self选择当前节点。5.xpath运算符XPath表达式中可以使用的运算符如下:运算符说明实例返回值计算两个节点集//book//cd返回所有有book和cd元素的节点集+加法6+410-减法6-42*乘法6*424div除法8div42=等于价格=9.80如果价格为9.80,则返回真。如果价格为9.90,则返回false。!=不等于价格!=9.80如果价格为9.90,则返回真。如果价格为9.80,则返回false。<小于价格<9.80如果价格为9.00,则返回真。如果价格为9.90,则返回false。<=小于或等于价格<=9.80如果价格为9.00,则返回真。如果价格为9.90,则返回false。>大于价格>9.80如果价格为9.90,则返回真。如果价格为9.80,则返回false。>=大于或等于价格>=9.80如果价格为9.90,则返回真。如果价格为9.70,则返回false。ororprice=9.80orprice=9.70如果价格为9.80,则返回true。如果价格为9.50,则返回false。如果价格为9.80,则价格>9.00且价格<9.90返回真。如果价格为8.50,则返回false。mod计算division5mod21的余数那么,这就是xpath的全部内容。接下来介绍一个神器lxml,速度非常快。在使用beautifulsoup时,它一直是我最喜欢的解析器。没有之一,因为它的速度确实比其他的html.parser和html5lib要快很多。2.lxml1.lxml安装lxml是一个xpath格式的解析模块,安装非常方便,直接pipinstalllxml或者easy_installlxml即可。2.lxml使用lxml提供了两种解析网页的方式,一种是你自己写的离线网页解析,一种是在线网页解析。导入包:fromlxmlimportetree1。解析离线网页:html=etree.parse('xx.html',etree.HTMLParser())aa=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h2/a[1]/@href')print(aa)2、解析在线网页:fromlxmlimportetreeimportrequestsrep=requests.get('https://www.baidu.com')html=etree.HTML(rep.text)aa=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h2/a[1]/@href')print(aa)那么我们如何获取这些标签及其对应的属性值呢?这很简单。首先,获取标签只需要这样:然后我们就可以,比如你想获取a标签中的文本及其属性href对应的值,有两种方法,1、获取aa=html。xpath('//*[@id="s_xmancard_news"]/div/div[表达式中的2]/div/div[1]/h2/a[1]/text()')ab=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h2/a[1]/@href')2.获取aa=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/divexpression[1]/h2/a[1]')aa.textaa.attrib.get('href')这样就完成了收购,怎么样,是不是很简单,哈哈哈。接下来是lxml的解析规则:表达式描述nodename选择本节点的所有子节点/从当前节点选择直接子节点//从当前节点选择后代节点。selectsthecurrentnode..selectstheparentnodeofthecurrentnode@selectstheattributehtml=lxml.etree.HTML(text)#使用text构造一个XPath解析对象,etree模块可以自动修正HTML文本html=lxml.etree.parse('./ex.html',etree.HTMLParser())#直接读取从lxml中取出文本进行分析importetreeresult=html.xpath('//*')#选择所有节点result=html.xpath('//li')#获取所有li节点result=html.xpath('//li/a')#获取所有li节点的所有直a子节点result=html.xpath('//li//a')#获取所有li节点的所有a后代节点result=html.xpath('//a[@href="link.html"]/../@class')#获取所有a的父节点的class属性href属性为link.html的nodesresult=html.xpath('//li[@class="ni"]')#获取class属性为ni的所有li节点result=html.xpath('//li/text()')#获取所有li节点的textresult=html.xpath('//li/a/@href')#获取所有li节点的一个节点的href属性result=html.xpath('//李[包含(@类,"li")]/a/text())#当li的class属性有多个值时,需要使用contains函数完成匹配result=html.xpath('//li[contains(@class,"li")and@name="item"]/a/text()')#更多属性匹配result=html.xpath('//li[1]/a/text()')result=html.xpath('//li[last()]/a/text()')result=html。xpath('//li[position()<3]/a/text()')result=html.xpath('//li[last()-2]/a/text()')#依次选择,方括号中XPath提供的函数result=html.xpath('//li[1]/ancestor::*')#获取祖先节点result=html.xpath('//li[1]/ancestor::div')result=html.xpath('//li[1]/attribute::*')#获取属性值result=html.xpath('//li[1]/child::a[@href="link1.html"]')#获取直接子节点result=html.xpath('//li[1]/descendant::span')#获取所有后代节点result=html.xpath('//li[1]/following::*[2]')#获取当前节点之后第二个resultofallnodes=html.xpath('//li[1]/following-sibling::*')#获取所有后续兄弟节点3.lxmlcase为了偷懒,我决定使用urllib的代码文章的,哈哈哈,机智如我,今天就说这么多,有兴趣的可以多多关注,精彩不停歇!!!!本文参考资料:https://www.w3school.com.cn/如果想了解更多前端、Python爬虫、大数据等计算机知识,请访问:http://pdcfighting。com/想了解更多Python网络爬虫和数据挖掘知识,可以到专业网站:http://pdcfighting.com/