继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

爬虫---解析库的使用

天上掉下个小馅饼
关注TA
已关注
手记 3
粉丝 7
获赞 3

解析库的使用

使用XPath

  • XPATH全称XML Path Language,即XML路径语言,它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索
  • XPath的常用规则
    • nodename:选取此节点的所有子节点
    • /:从当前节点选取直接子节点
    • //:从当前节点选取子孙节点
    • . :选取当前节点
    • … :选取当前节点的父节点
    • @:选取属性
    • //title[@lang=‘eng’]
      • 这就是一个XPath规则,它代表选择所有名称为title,同时属性lang的值为eng的节点
  • 实例引入
    • 5f055c10.png
    • 首先引入了lxml的etree模块
    • 然后声明了一段HTML文本,调用HTML类进行初始化,这样就成功构造了一个XPath解析对象
    • 这里需要注意的是,HTML文本的最后一个li节点是没有闭合的,但是etree模块可以自动修正HTML文本
    • 调用tostring()方法即可输出修正后的HTML代码,但是结果是byes类型,这里利用decode()方法将其转成str类型
  • 所有节点
    • 一般会用//开头的XPath规则来选取所有符合要求的节点
    • 返回形式是一个列表,如果要取出其中一个对象,可以直接用中括号加索引
    • 每个元素是Element类型
  • 子节点
    • 通过/ 或者//即可查找元素的直接子节点子孙节点
    • 比如:xpath(//li/a)获取所有直接子节点,或者xpath(//li//a)获取所有的子孙节点
  • 父节点
    • 获取父节点的方式:…或者parent::
  • 属性匹配
    • 可以用@符号进行属性过滤,比如,这里如果要选取class为item-0的li节点
      703da813.png
  • 文本获取
    • 可以用XPath中的**text()**方法获取节点中的文本,只是文本,不包括节点
  • 属性获取
    • 获取节点属性还是用@符号就可以了
      7341128b.png
    • 此处和属性匹配的方法不同,属性匹配中括号加属性名和值来限定某个属性,如[@href=“link1.html”],而此处的@href指的是获取节点的某个属性,二者需要做好区分
  • 属性多值匹配
    • 如果节点的某个属性有两个值得话,用之前的属性匹配就获取不到了,这时候就要使用contains()函数,如下:
      01b850d8.png
    • 第一个参数传入属性名称第二个参数传入属性值,只要此属性包含所传入的属性值,就可以完成匹配
  • 多属性匹配
    • 根据多个属性确定一个节点,使用运算符 and 来连接,如下:
      b72e0218.png
  • 按序选择
    • 匹配多个节点时,若只要其中一个的话,有以下方法
      1. 使用序号来获取,比如li[1],注意这里的序号是从1开始的,而不是从0开始
      2. 使用函数,比如last(),position()等
        f9bb3551.png
  • 节点轴
    • 11deb193.png
打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP