当前位置: 首页 > 科技观察

Python解析库Lxml和XPath使用总结

时间:2023-03-21 21:37:42 科技观察

本文主要介绍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选择该节点的所有子节点。/从根节点选择。//从与选择匹配的当前节点中选择文档中的节点,无论它们的位置如何。.选择当前节点。..选择当前节点的父节点。@选择属性。在下表中,我们列出了一些路径表达式及其结果:路径表达式结果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元素。选择多个路径您可以使用“|”选择多个路径路径表达式中的运算符。在下表中我们列出了一些路径表达式,以及它们的结果:PathExpressionResult//book/title|//book/price选择了book元素的所有title和price元素。//title|//price选择文档中所有的title和price元素。/bookstore/book/title|//price选择书店元素的所有title元素,以及文档中的所有price元素。4.xpath轴可以定义相对于当前节点的节点集。轴名称结果祖先选择当前节点的所有祖先(父、祖父母等)。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=等于price=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计算除法5mod21的余数好吧,这就是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/div[1]/h2/a在表达式[1]')aa.textaa.attrib.get('href')之外完成收购,怎么样,是不是很简单,哈哈哈。lxml的解析规则来了:表达式描述nodenameSelectallchildnodesofthisnode/Selectdirectchildnodesfromthecurrentnode//Selectdescendantnodesfromthecurrentnode。选择当前节点..选择当前节点的父节点@选择属性html=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节点的子节点result=html.xpath('//li//a')#获取所有a所有li节点的后代节点result=html.xpath('//a[@href="link.html"]/../@class')#获取a节点的父节点的所有class属性href属性为link.htmlresult=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[contains(@class,"li")]/a/text())#li的class属性有多个值时,需要使用contains函数完成匹配result=html.xpath('//li[contains(@class,"li")and@name="item"]/a/text()')#多属性匹配结果=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]')#Get当前节点之后的所有节点第二个result=html.xpath('//li[1]/following-sibling::*')#获取所有后续的兄弟节点3.lxml案例为了偷懒,小编决定使用urllib代码的文章,哈哈哈,机智如我,今天就说这么多,有兴趣的可以多多关注,激动的是没完没了!!!!本文参考资料:https://www.w3school.com.cn/本文转载自微信公众号“IT分享之家”,可通过以下二维码关注。转载本文请联系IT分享之家公众号。