您当前的位置: 首页 >  Python
  • 2浏览

    0关注

    28博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【第二章-5】Python爬虫教程(xpath解析)

我愚蠢的理想主义_Cheergo 发布时间:2022-08-22 03:26:40 ,浏览量:2

本课程共五个章节,课程地址:

【Python爬虫教程】花9888买的Python爬虫全套教程2021完整版现分享给大家!(已更新项目)——附赠课程与资料_哔哩哔哩_bilibili

第二章
  1. 数据解析概述
  2. 正则表达式
  3. re模块
  4. 手刃豆瓣TOP250电影信息
  5. bs4解析-HTML语法
  6. bs4解析-bs4模块安装和使用
  7. 抓取让你睡不着觉的图片
  8. xpath解析
  9. 抓取猪八戒数据

目录

第二章

(八)xpath解析

用法

案例一

案例二

小技巧

(八)xpath解析

xpath 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。而我们熟知的 HTML 恰巧属于 XML 的一个子集,所以完全可以用 xpath 去查找 html 中的内容。xpath 比 re 和 bs4 既简单又高效


    1
    野花遍地香
    1.23
    
        周大强
        周芷若
    


# xpath的语法规则:靠着节点之间的关系去查找,如:/book/price;也可以通过属性来查找,如bs4

在上述 html 中:

  1. book、id、name、price... 都被称为节点
  2. id、name、price、author 被称为 book 的子节点
  3. book 被称为 id、name、price、author 的父节点
  4. id、name、price、author 被称为同胞节点

用 xpath解析 就可以用节点之间的关系来去查找某个节点

在python中想要使用xpath,需要安装lxml模块

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple lxml
用法:
  1. 将要解析的html内容构造出etree对象
  2. 使用etree对象的xpath()方法,配合xpath表达式来完成对数据的提取 
案例一: 
# xpath解析
from lxml import etree   # etree里包含了xpath的功能  etree.XML().xpath()

xml = """

    1
    野花遍地香
    1.23
    臭豆腐
    
        周大强
        周芷若
        周杰伦
        蔡依林
        
热1
热2 胖胖陈 胖胖不陈 """ tree = etree.XML(xml) # 把内容加载为etree对象 result = tree.xpath("/book") # /表示层级关系. 第一个/是根节点 [] result = tree.xpath("/book/name") # [] result = tree.xpath("/book/name/text()") # text() 拿文本 ['野花遍地香'] result = tree.xpath("/book/author//nick/text()") # // 所有后代 ['周大强', '周芷若', '周杰伦', '蔡依林', '热1', '热2'] # 热1为 author/div/nick 热2为 author/span/nick result = tree.xpath("/book/author/*/nick/text()") # * 任意的节点. 通配符 ['热1', '热2'] # 拿所有nick result = tree.xpath("/book//nick/text()") # ['臭豆腐', '周大强', '周芷若', '周杰伦', '蔡依林', '热1', '热2', '胖胖陈', '胖胖不陈'] print(result)
案例二:

先看提前准备好的一个网页(b.html):



    
        
        Title
    
    
        
  • 百度
  • 谷歌
  • 搜狗
  1. 飞机
  2. 大炮
  3. 火车
李嘉诚
胡辣汤

xpath如何提取属性信息?三个重要的点:

局部解析:./ 

属性选取:[@class='xxx']

获取文本:text()

查找: 

from lxml import etree

tree = etree.parse("b.html")   # .parse() 加载文件

# ['百度', '谷歌', '搜狗']
result = tree.xpath("/html/body/ul/li/a/text()")

# ['百度']
result = tree.xpath("/html/body/ul/li[1]/a/text()")  # xpath的顺序是从1开始数的, []表示索引

# ['大炮']
result = tree.xpath("/html/body/ol/li/a[@href='dapao']/text()")  # [@xxx=xxx] 属性的筛选

print(result)

遍历: 

ol_li_list = tree.xpath("/html/body/ol/li")

for li in ol_li_list:
    # 从每一个li中提取到文字信息
    result = li.xpath("./a/text()")  # 局部解析  在li中继续去寻找. 相对查找   ./表示当前节点,即li
    print(result)

    result2 = li.xpath("./a/@href")  # 拿到属性值: @属性
    print(result2)
result result2

拿属性值:

print(tree.xpath("/html/body/ul/li/a/@href"))

小技巧: 

但是当网页源代码极其复杂时,不易看出结构,此时有一个小技巧

在网页按 f12,查看 Elements,如下:

# ['李嘉诚']
print(tree.xpath('/html/body/div[1]/text()'))

# ['大炮']
print(tree.xpath('/html/body/ol/li[2]/a/text()'))

# ['飞机', '大炮', '火车']
print(tree.xpath('/html/body/ol/li/a/text()'))   # 做个微调
关注
打赏
1662226828
查看更多评论
立即登录/注册

微信扫码登录

0.0412s