• 爬虫学习02_数据提取


    JSON数据

    哪里能找到返回json的url呢?
    1、使用chrome切换到手机页面
    2、抓包手机app的软件

    JSONView插件,方便查看json数据

    有时候url里有callback参数,可以直接去除,得到想要的数据

    json.loads()
    json.dumps(ret,ensure_ascii=False,indent=4)   # 不转换成ascii码,且使用4空格缩进
    

    json使用注意点

    • json中的字符串都是双引号引起来的,如果不是双引号需要进行预处理:

      • eval:能实现简单的字符串和python类型的转化
      • replace:把单引号替换为双引号
    • 往一个文件中写入多个json串,不再是一个json串,不能直接读取

      • 解决办法:一行写一个json串,按照行来读取

    正则使用的注意点

    • re.findall("a(.*?)b","str"),能够返回括号中的内容,括号前后的内容起到定位和过滤的效果

    • 原始字符串r,待匹配字符串中有反斜杠的时候,使用r能够忽视反斜杠带来的转义的效果

    • 点号默认情况匹配不到

    • s能够匹配空白字符,不仅仅包含空格,还有 |

    • 匹配中文需要先将字符串编码成utf8格式

    XPath

    XPath (XML Path Language) 是一门在 HTMLXML 文档中查找信息的语言,
    可用来在 HTMLXML 文档中对元素和属性进行遍历。
    W3School官方文档

    使用xpath helper或者是chrome中的copy xpath都是从element中提取的数据,但是爬虫获取的是url对应的响应,往往和elements不一样

    • 获取文本text()

        a/text()     # 只能获取a下的文本
        a//text()    # 能够获取a下的和a包含的标签的文本
        //a[text()='下一页']    # 选择文本为下一页三个字的a标签
      
    • @符号

        a/@href     # 获取属性
        //ul[@id="detail-list"]     # 筛选属性
        //ul[contains(text(),'今日更新')]   # 筛选包含字段的节点
      
    • //

        //...    # 在xpath最前面表示从当前html中任意位置开始选择
        li//a    # 放在节点后面的时候,能够选择当前节点下的所有的标签
      
    • xpath获取某一个或者某几个

        //a[1]          # 第一个
        //a[last()]     # 最后一个
        //a[position()<=3]
        //a[1]|//a[3]
      
    • 通配符

        *       # 匹配任何元素节点
        @*      # 匹配任何属性节点
        node()  # 匹配任何类型节点
        |       # 或
      

    xpath的更多语法

    lxml使用注意点

    lxml是一款高性能的 Python HTML/XML 解析器,我们可以利用XPath,来快速的定位特定元素以及获取节点信息

    from lxml import etree
    html = etree.HTML(text)     # 将字符串转化为Element对象,能够接受bytes和str的字符串
    etree.tostring(html)        # 查看转换后的字符串
    html.xpath('//a/text()')    # Element对象具有xpath的方法, 结果是一个Element对象的列表(无则为空)
    

    lxml能够修正补全HTML代码,但是可能会改错了

    -> 使用etree.tostring观察修改之后的html的样子,根据修改之后的html字符串写xpath
    

    提取页面数据的思路

    1. 先分组,渠道一个包含分组标签的列表
    2. 遍历,取其中每一组进行数据的提取,不会造成数据的对应错乱
    
        # 1.设置起始url
        start_url = self.url_temp
        # 2.发送请求,获取响应
        content_str = self.parse_url(start_url)
        # 3.提取数据
        xml = etree.XML(content_str)     # 将字符串转化为Element对象,能够接受bytes和str的字符串
        # etree.tostring(xml)        # 查看转换后的字符串
        print(xml.xpath('//class//text()'))
  • 相关阅读:
    Python_反射
    Python_面向对象_类2
    Python_面向对象_类1
    Python_logging模块
    Python_子进程管理subprocess模块
    Python_python内置加密模块
    Python_configparser模块
    Python_xml
    Python_shelve模块
    Python_shutil模块
  • 原文地址:https://www.cnblogs.com/JeromeLong/p/13235617.html
Copyright © 2020-2023  润新知