• 网络爬虫之数据解析方式


    Python网络爬虫之数据解析方式

    正则解析

    单字符:
            . : 除换行以外所有字符
            [] :[aoe] [a-w] 匹配集合中任意一个字符
            d :数字  [0-9]
            D : 非数字
            w :数字、字母、下划线、中文
            W : w
            s :所有的空白字符包,括空格、制表符、换页符等等。等价于 [ f
    
    	v]S : 非空白
        数量修饰:
            * : 任意多次  >=0
            + : 至少1次   >=1
            ? : 可有可无  0次或者1次
            {m} :固定m次 hello{3,}
            {m,} :至少m次
            {m,n} :m-n边界:
            $ : 以某某结尾 
            ^ : 以某某开头
        分组:
            (ab)  
        贪婪模式 .*
        非贪婪(惰性)模式 .*?
    
        re.I : 忽略大小写
        re.M :多行匹配
        re.S :单行匹配
    
        re.sub(正则表达式, 替换内容, 字符串)
    

    xpath解析

    from lxml import etree
        两种方式使用:将html文档变成一个对象,然后调用对象的方法去查找指定的节点
        1)本地文件
            tree = etree.parse(文件名)
        2)网络文件
            tree = etree.HTML(网页字符串)
    
        ret = tree.xpath(路径表达式)
        【注】ret是一个列表
      参考文献:http://www.w3school.com.cn/xpath/xpath_intro.asp
    
      - 安装xpath插件:可以在插件中直接执行xpath表达式
    
        1.将xpath插件拖动到谷歌浏览器拓展程序(更多工具)中,安装成功
    
        2.启动和关闭插件 ctrl + shift + x
    
    - 常用表达式:
      /bookstore/book           选取根节点bookstore下面所有直接子节点book
        //book                    选取所有book
        /bookstore//book          查找bookstore下面所有的book
        /bookstore/book[1]        bookstore里面的第一个book
        /bookstore/book[last()]   bookstore里面的最后一个book
        /bookstore/book[position()<3]  前两个book
        //title[@lang]            所有的带有lang属性的title节点
        //title[@lang='eng']      所有的lang属性值为eng的title节点
        属性定位
                //li[@id="hua"]
                //div[@class="song"]
        层级定位&索引
                //div[@id="head"]/div/div[2]/a[@class="toindex"]
                【注】索引从1开始
                //div[@id="head"]//a[@class="toindex"]
                【注】双斜杠代表下面所有的a节点,不管位置
         逻辑运算
                //input[@class="s_ipt" and @name="wd"]
         模糊匹配 :
              contains
                    //input[contains(@class, "s_i")]
                    所有的input,有class属性,并且属性中带有s_i的节点
                    //input[contains(text(), "爱")]
                starts-with
                    //input[starts-with(@class, "s")]
                    所有的input,有class属性,并且属性以s开头
          取文本
                //div[@id="u1"]/a[5]/text()  获取节点内容
                //div[@id="u1"]//text()      获取节点里面不带标签的所有内容
          取属性
                //div[@id="u1"]/a[5]/@href    
    
    
    - 代码中使用xpath    1.导包:from lxml import etree
    
        2.将html文档或者xml文档转换成一个etree对象,然后调用对象中的方法查找指定的节点
    
          2.1 本地文件:tree = etree.parse(文件名)
    
          2.2 网络数据:tree = etree.HTML(网页内容字符串)
    
      - 综合练习:
    
        需求:获取好段子中段子的内容和作者   http://www.haoduanzi.com
    
    from lxml import etree
    import requests
    
    url='http://www.haoduanzi.com/category-10_2.html'
    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
        }
    url_content=requests.get(url,headers=headers).text
    #使用xpath对url_conten进行解析
    #使用xpath解析从网络上获取的数据
    tree=etree.HTML(url_content)
    #解析获取当页所有段子的标题
    title_list=tree.xpath('//div[@class="log cate10 auth1"]/h3/a/text()')
    
    ele_div_list=tree.xpath('//div[@class="log cate10 auth1"]')
    
    text_list=[] #最终会存储12个段子的文本内容
    for ele in ele_div_list:
        #段子的文本内容(是存放在list列表中)
        text_list=ele.xpath('./div[@class="cont"]//text()')
        #list列表中的文本内容全部提取到一个字符串中
        text_str=str(text_list)
        #字符串形式的文本内容防止到all_text列表中
        text_list.append(text_str)
    print(title_list)
    print(text_list)
  • 相关阅读:
    栈及其在.NET FrameWork中的源码分析
    《高性能网站建设指南》读书笔记
    九宫格数独问题
    队列及其在.NET FrameWork中的源码分析
    《web标准之道》读后感(书评)
    SharePoint中的权限体系
    关于异步方法调用
    WF4.0 Beta2:关于动态保存和装载XAML工作流
    Lotus Symphony介绍及试用
    Node.js 0.8.18 / 0.9.7 发布
  • 原文地址:https://www.cnblogs.com/luck-L/p/9710724.html
Copyright © 2020-2023  润新知