码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 非常全的一份Python爬虫的Xpath博文


    系列目录

    非常全的一份Python爬虫的Xpath博文

    Xpath 是 python 爬虫过程中非常重要的一个用来定位的一种语法。

    一、开始使用

    首先我们需要得到一个 HTML 源代码,用来模拟爬取网页中的源代码。

    首先我们需要下载一下 lxml 包。

    pip install lxml
    

    准备一个HTML源代码。

    from lxml import etree
    
    doc='''
            
    • first item
    • second item
    • third item
    • fourth item
    • fifth item # 注意,此处缺少一个
    • 闭合标签
    '''
    html = etree.HTML(doc) result = etree.tostring(html) print(str(result, 'utf-8'))

    二、节点、元素、属性、内容

    xpath 的思想是通过 路径表达 去寻找节点。节点包括元素,属性,和内容。

    2.1 路径表达式

    /   根节点,节点分隔符,
    //  任意位置
    .   当前节点
    ..  父级节点
    @   属性
    

    2.2 通配符

    *   任意元素
    @*  任意属性
    node()  任意子节点(元素,属性,内容)
    

    2.3 谓语

    使用中括号来限定元素,称为谓语

    //a[n] n为大于零的整数,代表子元素排在第n个位置的元素
    //a[last()]   last()  代表子元素排在最后个位置的元素
    //a[last()-]  和上面同理,代表倒数第二个
    //a[position()<3] 位置序号小于3,也就是前两个,这里我们可以看出xpath中的序列是从1开始
    //a[@href]    拥有href的元素
    //a[@href='www.baidu.com']    href属性值为'www.baidu.com'的元素
    //book[@price>2]   price值大于2的元素
    

    三、定位

    3.1 匹配多个元素,返回列表

    from lxml import etree
    
    if __name__ == '__main__':
        doc='''
            
    • first item
    • second item
    • third item
    • fourth item
    • fifth item
    ''' html = etree.HTML(doc) print(html.xpath("//li")) print(html.xpath("//p")) print(etree.tostring(html.xpath("//li[@class='item-inactive']")[0])) print(html.xpath("//li[@class='item-inactive']")[0].text) print(html.xpath("//li[@class='item-inactive']/a")[0].text) print(html.xpath("//li[@class='item-inactive']/a/text()")) print(html.xpath("//li[@class='item-inactive']/..")) print(html.xpath("//li[@class='item-inactive']/../li[@class='item-0']"))

    3.2 contains

    有的时候,class作为选择条件的时候不合适@class='....' 这个是完全匹配,当网页样式发生变化时,class或许会增加或减少像active的class。用contains就能很方便

    from lxml import etree
    if __name__ == '__main__':
        doc='''
            

      first item

    • second item
    • third item
    • fourth item
    • fifth item # 注意,此处缺少一个
    • 闭合标签
    '''
    html = etree.HTML(doc) print(html.xpath("//li[@class='item']")) print(html.xpath("//*[contains(@class,'item')]"))

    3.3 starts-with

    包含某个属性的第一个节点。

    from lxml import etree
    if __name__ == '__main__':
        doc='''
            

      first item

    • second item
    • third item
    • fourth item
    • fifth item # 注意,此处缺少一个
    • 闭合标签
    '''
    html = etree.HTML(doc) print(html.xpath("//*[contains(@class,'item')]")) print(html.xpath("//*[starts-with(@class,'ul')]"))

    3.4 text、last

    from lxml import etree
    
    if __name__ == '__main__':
        doc='''
            

      first item

    • second item
    • third item
    • fourth item
    • fifth item # 注意,此处缺少一个
    • 闭合标签
    '''
    html = etree.HTML(doc) print(html.xpath("//li[last()]/a/text()"))

    3.5 获取内容

    刚刚已经提到过,可以使用.text和text()的方式来获取元素的内容

    
    
    from lxml import etree
    if __name__ == '__main__':
        doc='''
            
    • first item
    • second item
    • third item
    • fourth item
    • fifth item # 注意,此处缺少一个
    • 闭合标签
    '''
    html = etree.XML(doc) print(html.xpath("//a/text()")) print(html.xpath("//a")[0].text) print(html.xpath("//ul")[0].text) print(len(html.xpath("//ul")[0].text)) print(html.xpath("//ul/text()"))

    3.6 获取属性

    print(html.xpath("//a/@href"))
    print(html.xpath("//li/@class"))
    

    四、使用Xpath爬取豆瓣

    import requests
    from lxml import etree
    
    
    def main():
        head = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
        }
    
        baseurl = "https://movie.douban.com/top250?start="
    
        res = requests.get(url=baseurl, headers=head).text
    
        data = etree.HTML(res)
    
        # 电影排行榜
        txt = data.xpath('//*[@id="content"]/div/div[1]/ol/li')
    
        list = []
    
        for i in txt:
            vidow = {
                "title": "",
                "year": '',
                "score": 0,
                "num": 0
            }
            title_list = i.xpath('./div/div[2]/div[1]/a/span/text()')
            for item in title_list:
                vidow['title'] += item.replace("\n", "").replace("\xa0", " ")
    
            vidow['year'] = i.xpath('./div/div[2]/div[2]/p[1]/text()')[1].split("/")[0].replace("\n", "").replace("\xa0", " ").replace(" ", "")
            vidow['score'] = i.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]
            vidow['num'] = i.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0].replace("人评价", "")
    
            list.append(vidow)
    
        print(list)
    
    
    if __name__ == '__main__':
        main()
    
  • 相关阅读:
    (3) MasaFramework 入门第三篇,使用MasaFramework
    bootstrap treeview基本用法+横向显示
    R语言ggplot2可视化:使用ggpubr包的ggpaired函数可视化配对数据(可视化箱图并使用线段连接配对的数据点)
    Allegro如何导出器件坐标文件
    Sphinx Docstring
    PDF 如何高效的转换成 markdown
    Jitter
    网络工程类面试非技术问题
    C# - 能否让 SortedSet.RemoveWhere 内传入的委托异步执行
    YUV和RGB的相互转换实验
  • 原文地址:https://www.cnblogs.com/chenyangqit/p/16594725.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号