Python中xPath技术和BeautifulSoup的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中xPath技术和BeautifulSoup的使用相关的知识,希望对你有一定的参考价值。

xpath基本知识

      XPath语法:使用路径表达式来选取XML或HTML文档中的节点或节点集

                路径表达式

       nodename:表示选取此节点的所有子节点

          /    : 表示从根节点选取

          //   :选择任意位置的某个节点。

           .  :选取当前节点

          ..   :选取当前节点的父节点

          @   :选取属性

                                                 谓语实例

        实现效果                                                                 路劲表达式

选取属于classroom子元素的第一个student元素              /classroom/student[1]

选取属于classroom子元素的最后一个student元素            /classroom/student[last()]

选取属于classroom子元素的倒数第二个stduent元素         /classroom/stduent[last()-1]

选取最前面的两个属于classroom元素的子元素的student元素  /classroom/stduent[position()<3]

选取所有拥有名为lang的属性的name元素                                //name[@lang]

选取所有name元素,且这些元素拥有值为eng的lang属性   //name[@lang=‘en‘]

选取classroom元素的所有student元素,且其中的age元素的值须大于20   .classroom.stduent[age>20]

选取classroom元素中的student元素的所有name元素,且其中的age元素的值须大于20   /classroom/stduent[age>20]/name

                                   通配符“*”与“|”操作

         实现效果                                                    路径表达式

选取classroom元素的所有子元素                      /classroom/*

选取文档中的所有元素                                       //*

选取所有带有属性的name元素                          //name[@*]

选取stduent元素的所有name和age元素           //stduent/name | //stduent/age

选取属于classroom元素的student元素的所有name元素,以及文档中所有的age元素             /classroom/stduent/name | //age

  XPath轴                  步的语法为   轴名称:节点测试[谓语]

             轴名称                                                           含义

            child                                           选取当前节点的所有子节点

           parent                                            选取当前节点的父节点

          ancestor                                          选取当前节点的所有先辈(父、祖父等)

          ancestor-or-self                      选取当前节点的所有先辈以及当前节点本身

            descendant                          选取当前节点的所有后代节点

          descendant-or-self              选取当前节点的所有后代节点以及当前节点本身

          preceding                            选取文档中当前节点的开始标记之前的所有节点

          following                                选取文档中当前节点的结束标记之后的所有节点

          preceding-sibling      选取当前节点之前的所有同级节点

          following-sibling           选取当前节点之后的所用同级节点

           self                                 选取当前节点

          attribute                          选取当前节点的所有属性

          namespace                选取当前节点的所有命名空间

                                                  XPath轴示例分析

              实现效果                                                                          路径表达式

 选取当前classroom节点中子元素的teacher节点                            /classroom/child::teacher

选取所有id节点的父节点                                                                  //id/parent::*

选取所有以classid为子节点的祖先节点                                             //classid/ancestor::*

选取classroom节点下的所有后代节点                                               /classroom/descendant::*

选取所有以student为父节点的id元素                                             //student/descendant::id

选取所有classid元素的祖先节点及本身                                             //classid/ancestor-or-self::*

选择/classroom/student本身及其所有后代元素                    /classroom/student/descendant-or-self::*

选取/classroom/teacher之前的所有同级节点,结果就是选所有的student节点   /classroom/teacher/preceding-sibling::*

选取/classroom中第二个stduent之后的所有同级节点            /classroom/student[2]/following-sibling::*

选取/classroom/teacher节点所有之前的节点(除其祖先外),不仅仅是student节点,还有里面的子节点  /classroom/teacher/preceding::*

选取/classroom中第二个student之后的所有节点,结果就是选择了teacher节点及其子节点    /classroom/student[2]/following::*

选取student节点,单独使用没有什么意思            //stduent/self::*

选取/classroom/teacher/name节点下的所有属性        /classroom/teacher/name/attribute::* 

 

                               XPath运算符示例分析

含义                                                                                                       实例

选取classroom元素的所有student元素                   /classroom/student[age=19+1]      /classroom/stduent[age=5*4]   /classroom/student[age=21-1]

且其中的age元素的值须等于20                                                 /classroom/student[age=40div2]

 

类似可以选取  大于、小于、不等于等操作

 

 

or   运算实例        /classroom/stduent[age<20 or age>25]                             .................age小于20或者大于25

and 运算实例        /classroom/stduent[age>20 and age<25]                           ..................age在20 到25 之间                                                             

mod  计算除法的余数     

 

实例代码

技术分享
from lxml import etree

contentStream = open(rxpathText.xml, rb)
content = contentStream.read().decode(utf-8)
root = etree.XML(content)
print(content)
print(-------)
em = root.xpath(/classroom/student[2]/following::*)
print(em[0].xpath(./name/text()))#获取name标签中文本的内容
print(em[0].xpath(./name/@lang)) #获取name标签中属性名为lang的属性值
View Code

 

 

BeautifulSoup基础知识

 

 

 

 

 

 

 

 

 

 

 

    

         

         

           

          

           

 

 

 

 

 

                           

 

 

 

 

                    

          

        

          

         

以上是关于Python中xPath技术和BeautifulSoup的使用的主要内容,如果未能解决你的问题,请参考以下文章

Python解析库lxml与xpath用法总结

XPath语法

python中的beautifulsoup和xpath有啥异同点

python中xpath用法问题

Python lxml包下面的xpath基本用法

Python爬虫杂记 - Xpath高级用法