最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 带你了解xpath:网页解析神器

    正文概述    2020-06-18   376

    带你了解xpath:网页解析神器

    使用XPath提取猫眼电影排行榜前100名。https://maoyan.com/board/4

    XPath数据提取

    XML介绍

    XML称为可扩展标记语言,XML是互联网数据传输的重要工具,它可以跨越互联网任何的平台,不受编程语言和操作系统的限制,可以说它是一个拥有互联网最高级别通行证的数据携带者。非常类似HTML。

    HTML 和 XML的区别在于HTML主要用来显示数据,XML是用来传输数据。

    XML都是标签闭合的。例如: …  成对出现。

    <?xml version="1.0" encoding="utf-8"?>
    
    <bookstore>
    
      <book category="奇幻">
        <title>冰与火之歌</title>
        <author>乔治 马丁</author>
        <year>2005</year>
        <price>365.00</price>
      </book>
    
      <book category="童话">
        <title>哈利波特与死亡圣器</title>
        <author>J K. 罗琳</author>
        <year>2005</year>
        <price>48.98</price>
      </book>
    
      <book category="编程">
        <title>Python编程-从入门到放弃</title>
        <author>挖掘机小王子</author>
        <year>2048</year>
        <price>99.00</price>
      </book>
    
      <book category="web" cover="paperback">
        <title>Python编程-从看懂到看开</title>
        <author>尼古拉斯-赵四</author>
        <year>2003</year>
        <price>39.95</price>
      </book>
    
    </bookstore>

    在上面的xml语法中存在父子,先辈等关系。

    XPath介绍

    XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言,可用来在 XML/HTML 文档中对元素和属性进行遍历,并提取相应元素。

    也是一种数据提取方式,只不过针对的是HTML/XML数据,因为爬虫主要和HTML页面打交道。

    XPath匹配规则

    下表是XPath常用的规则:
    带你了解xpath:网页解析神器

    lxml库

    lxml 是一个Python第三方模块。主要的功能是如何解析和提取 HTML/XML 数据。

    lxml和正则类似,是一款高性能的 Python HTML/XML 解析器,我们可以利用之前学习的XPath语法,来快速的定位特定元素以及节点信息。

    • 安装:pip install lxml

    失败的话指定下载源用 pip install lxml -i https://pypi.douban.com/simple  豆瓣源

    再安装 parsel 时会自动安装 lxml,这里就不需要再次安装了。

    使用lxml模块

    初始化生成一个XPath解析对象,同时可以自动补全残缺的HTML标签。传入网页源码。

    from lxml import etree
    
    string = """
      <book category="web" cover="paperback">
        <title>Python编程-从看懂到看开</title>
        <author>Python编程</author>
        <year>2003</year>
        <price>39.95</price>
      </book>
    """
    
    # 再解析之前必须先转化一下
    html = etree.HTML(string)
    # 返回结果是列表
    result = html.xpath("//book[contains(@cover,'paper')]/title/text()")
    result = html.xpath("//book[4]/title/text()")
    
    print(result)

    因为 parsellxml 进行了, 所以可以直接再 parsel 中无缝切换使用 xpath 。

    使用XPath选取指定内容。括号里面书写XPath语法规则。返回列表。

    # -*- coding: utf-8 -*-
    import requests
    import parsel
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
    }
    
    response = requests.get('https://maoyan.com/board/4?offset=0', headers=headers)
    html = response.text
    
    # %% 选择任意节点
    sel = parsel.Selector(html)
    # 提取 p 标签
    ps = sel.xpath('//p')
    for p in ps:
        print(p.get())

    案例:XPath提取猫眼电影

    '''
    猫眼电影:
    https://maoyan.com/board/4?offset=20
        函数式:
            1. 获取(请求)一页的函数
            2. 定义解析函数(解析一页)
            3. 写入文件函数
            4. 循环函数
            5. python学习交流群:695185429
    '''
    import json
    import requests
    from lxml import etree
    
    
    # 获取响应
    def getOnePage(url):
        '''获取一页的响应的函数'''
    
        response = requests.get(url)
    
        return response.text
    
    
    # 解析响应 --> 结果
    def parseOnePage(text):
    
        # 初始化解析
        html = etree.HTML(text)
        # 里面有所有的数据 先选择上一层  这一层里面包含所有数据 然后循环遍历
        data = html.xpath('//dl[@class="board-wrapper"]')
        # 遍历提取所有的元素
        for dat in data:
            print(dat)
            # 继续选取
            # 标题
            title = dat.xpath('.//div//a/text()')
            # 主演
            star = dat.xpath('.//p[@class="star"]/text()')
            # 时间
            releasetime = dat.xpath('//p[@class="releasetime"]/text()')
    
            for tit, sta, rel in zip(title, star, releasetime):
                # 在函数里面遇到return就终止
                # 生成器
                yield {
                    '电影名字': tit,
                    '主演': sta.strip(),
                    '上映时间': rel
                }
    
    
    def save2File(data):
        # with open('maoyan66.txt', 'a', encoding='utf-8') as fp:
        #     fp.write(data+'\n')
    
        with open('maoyan66.txt', 'a', encoding='utf-8') as fp:
            fp.write(json.dumps(data, ensure_ascii=False)+'\n')
    
    
    if __name__ == "__main__":
    
        for page in range(10):
    
            # 一页网址
            url = f'https://maoyan.com/board/4?offset={page*10}'
            # 调用
            r = getOnePage(url)
            # 解析数据 返回生成器
            result = parseOnePage(r)
            for res in result:
                # with open('maoyan.txt','a',encoding='utf-8') as fp:
                #     # 打印到文件
                #     print(str(res), file=fp)
                save2File(str(res))

    更多python相关文章,请关注python自学网。

    起源地下载网 » 带你了解xpath:网页解析神器

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元