博客
关于我
Python中xPath技术和BeautifulSoup的使用
阅读量:801 次
发布时间:2023-03-09

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

XPath与BeautifulSoup基础知识

XPath基础知识

XPath语法

XPath(XML Path Language)是一种用于在XML和HTML文档中定位节点或节点集的路径表达式语言。它通过路径表达式来描述从根节点到目标节点的路径。

路径表达式

  • nodename:表示选取此节点的所有子节点。
  • /:表示从根节点选取。
  • //:选择任意位置的某个节点。
  • .:表示选取当前节点。
  • ..:表示选取当前节点的父节点。
  • @:表示选取属性。

XPath示例

  • 选取属于classroom子元素的第一个student元素:
    /classroom/student[1]
  • 选取属于classroom子元素的最后一个student元素:
    /classroom/student[last()]
  • 选取属于classroom子元素的倒数第二个student元素:
    /classroom/student[last()-1]
  • 选取最前面的两个属于classroom子元素的子元素的student元素:
    /classroom/student[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

XPath轴与运算符

  • 轴名称:如child、parent、ancestor等,用于指定定位的方向。
    • child:选取当前节点的所有子节点。
    • parent:选取当前节点的父节点。
    • ancestor:选取当前节点的所有先辈(父、祖父等)。
    • ancestor-or-self:选取当前节点的所有先辈以及当前节点本身。
    • descendant:选取当前节点的所有后代节点。
    • descendant-or-self:选取当前节点的所有后代节点以及当前节点本身。
    • preceding:选取文档中当前节点的开始标记之前的所有节点。
    • following:选取文档中当前节点的结束标记之后的所有节点。
    • preceding-sibling:选取当前节点之前的所有同级节点。
    • following-sibling:选取当前节点之后的所有同级节点。
    • self:选取当前节点。
    • attribute:选取当前节点的所有属性。
    • namespace:选取当前节点的所有命名空间。

XPath运算符示例

  • 选取classroom元素的所有student元素:
    /classroom/student[age=19+1]
  • 选取classroom元素的所有student元素,且其中的age元素的值等于20:
    /classroom/student[age=40div2]
  • 选取classroom元素中的student元素的所有name元素,且其中的age元素的值大于20:
    /classroom/student[age>20]/name

BeautifulSoup基础知识

创建BeautifulSoup对象

  • 通过字符串创建:

    soup = BeautifulSoup(htl_str, 'lxml')

    其中'lxml'表示指定的解析方式。

  • 通过文件创建:

    soup = BeautifulSoup(open('index.html'))
  • BeautifulSoup对象种类

    BeautifulSoup对象分为四种类型:

  • Tag:表示HTML中的标记。
    • 获取标记名:soup.title.name
    • 获取标记属性:soup.title.attrs
    • 修改标记名:soup.title.name = 'mytitle'
  • NavigableString:表示标记中的文本内容。
    • 获取标记内容:soup.b.string
  • BeautifulSoup:表示整个文档的内容。
  • Comment:表示文档中的注释。
  • Traversing the Document

    • 子节点:
      • Tag.contents:获取标记的直接子节点。
      • Tag.children:获取标记的子节点生成器。
      • Tag.descendants:获取标记的所有子孙节点生成器。
    • 父节点:
      • Tag.parent:获取标记的父节点。
      • Tag.parents:获取标记的所有父辈节点。

    Searching the Document

    • find_all()方法:
      • find_all(name, attrs, recursive, text, **kwargs)
      • name参数:查找所有名字为name的标记。
      • attrs参数:查找具有指定属性的标记。
      • text参数:查找文档中的字符串内容。

    实际应用示例

    • 获取classroom元素的所有student元素:
      em = root.xpath('//classroom/student')
    • 获取classroom元素中的student元素的name属性:
      name_elements = em.xpath('//classroom/student/name/text()')
    • 获取classroom元素中的student元素的age值:
      age_values = em.xpath('//classroom/student/age/text()')

    通过以上方法,可以高效地在HTML和XML文档中定位和提取所需的信息。

    转载地址:http://rilfk.baihongyu.com/

    你可能感兴趣的文章