Python爬虫解析库之xpath解析库详解

Python爬虫解析库之xpath解析库详解

2023年6月29日发(作者:)

Python爬⾍解析库之xpath解析库详解xpath解析库详解简单说明XPath的选择功能⼗分强⼤,它提供了⾮常简洁明了的路径选择表达式。XPath相对于正则表达式显得更加简洁明了,对于⽹页的节点来说,它可以定义id、class或其他属性。⽽且节点之间还有层次关系,在⽹页中可以通过XPath来定位⼀个或多个节点规则表达式nodename///.…@描述选取此节点的所有⼦节点从当前结点选取直接⼦节点从当前节点选取⼦孙结点选取当前节点选取当前节点的⽗节点选取属性具体的代码展⽰⼀.解析⽂本代码from lxml import etreetext = '''

'''html = (text)result = ng(html)print(('utf-8'))这⾥⾸先导⼊lxml库的etree模块,然后声明⼀段HTML⽂本,调⽤HTML类进⾏初始化,这样就成功构造了⼀个XPath解析对象。这⾥需要注意的是,HTML⽂本中的最后⼀个li节点是没有闭合的,但是etree模块可以⾃动修正HTML⽂本。这⾥我们调⽤tostring()⽅法即可输出修正后的HTML代码,但是结果是bytes类型。这⾥利⽤decode()⽅法将其转成str类型,结果如下:⼆.解析⽂本⽂件from lxml import etreehtml=('***/',rser())result=ng(html)print(('utf-8'))三.获取所有节点from lxml import etreetext = ''''''html = (text)result=('//li')print(result)print(result[0])四.属性匹配from lxml import etreehtml=('***/',rser())result=('//li[@class="item-0"]')print(result)五.⽂本获取我们使⽤XPath中的text()⽅法获取节点中的⽂本from lxml import etreehtml=('./',rser())result=('//li[@class="item-0"]/text()')print(result)#

运⾏结果如下:# ['n ']我们并没有获取到任何⽂本,只获取到了⼀个换⾏符,原因在于XPath中text()前⾯是/,⽽此处的/的含义是选取直接⼦节点,很明显li的直接⼦节点都是a节点,⽂本都在a节点的内部,所有这⾥匹配到的结果就是被修正的li节点内部的换⾏符,因为⾃动修正的li节点的尾标签换⾏了,因此,如果想获取li节点内部的⽂本,就有两种⽅式,⼀种是先选取a节点再获取⽂本,另⼀种就是使⽤//。接下来,我们看⼀下⼆者的区别。from lxml import etreehtml=('***/',rser())result=('//li[@class="item-0"]/a/text()')print(result)#

运⾏结果如下:# ['first item', 'fifth item']from lxml import etreehtml=('***/',rser())result=('//li[@class="item-0"]//text()')print(result)#

运⾏结果如下:# ['first item', 'fifth item', 'n']六.属性获取from lxml import etreehtml=('***/',rser())result=('//li/a/@href')print(result)这⾥我们通过@href既可获取节点的href属性。注意,此处和属性匹配的⽅法不同,属性匹配是中括号加属性名和值来限定某个属性,如[@href=“”],⽽此处的@href指的是获取节点的某个属性,⼆者需要做好区分七.属性多值匹配from lxml import etreetext = '''

  • first item
  • '''html = (text)result = ('//li[@class="li"]/a/text()')print(result)#

    这⾥HTML⽂本中li节点的class属性有两个值li和li-first,此时如果还想⽤之前的属性匹配获取,就⽆法匹配了,此时运⾏结果如下:# []需要⽤contains()函数from lxml import etreetext = '''

  • first item
  • '''html = (text)result = ('//li[contains(@class,"li")]/a/text()')print(result)#

    这样通过contains()⽅法,第⼀个参数传⼊属性名称,第⼆个参数传⼊属性值,只要此属性包含所传⼊的属性值,就可以完成匹配。#

    运⾏结果如下:# ['first item']⼋.多属性匹配我们可能会遇到多个属性确定⼀个节点,这时就需要同时匹配多个属性。此时,可以使⽤运算符and来连接from lxml import etreetext = '''

  • first item
  • '''html = (text)result = ('//li[contains(@class, "li") and @name="item"]/a/text()')print(result)#

    运⾏结果如下:# ['first item']九.按序选择from lxml import etree

    text = '''

    '''html = (text)result = ('//li[1]/a/text()')print(result)result = ('//li[last()]/a/text()')print(result)result = ('//li[position()<3]/a/text()')print(result)result = ('//li[last()-2]/a/text()')print(result)#

    第⼀次选择时,我们选取了第⼀个li节点,中括号中传⼊数字1即可。注意,这⾥和代码中不同,序号是以1开头的,不是以0开头#

    第⼆次选择时,我们选取了最后⼀个li节点,中括号传⼊last()即可,返回便是最后⼀个li节点#

    第三次选择时,我们选取了位置⼩于3的li节点,也就是位置序号为1和2的节点,得到的结果就是前两个li节点。#

    第四次选择时,我们选取了倒数第三个li节点,中括号传⼊last()-2即可。因为last是最后⼀个,所有last()-2就是倒是第三个。#

    运⾏结果如下:# ['first item']# ['fifth item']# ['first item', 'second item']# ['third item']

    发布者:admin,转转请注明出处:http://www.yc00.com/web/1687984540a63783.html

    相关推荐

    发表回复

    评论列表(0条)

    • 暂无评论

    联系我们

    400-800-8888

    在线咨询: QQ交谈

    邮件:admin@example.com

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注微信