zoukankan      html  css  js  c++  java
  • 《python网络数据采集》读后感 第二章:复杂html解析

    1.BeautifulSoup里面find()和findAll()的区别:

    findAll(tag, attributes, recursive, text, limit, keywords)

    find(tag, attributes, recursive, text, keywords)

    a. 标签参数 tag可以传一个标签的名称或多个标签名称组成的 Python列表做标签参数。

    b. 属性参数 attributes 是用一个 Python 字典封装一个标签的若干属性和对应的属性值。下面这个函数会返回 HTML 文档里红色与绿色两种颜色的 span 标签:

                                       .findAll("span", {"class":{"green", "red"}})

    c. 递归参数 recursive 是一个布尔变量。你想抓取 HTML 文档标签结构里多少层的信息?如果recursive 设置为 True,findAll 就会根据你的要求去查找标签参数的所有子标签,以及子 标签的子标签。如果 recursive 设置为 False,findAll 就只查找文档的一级标签。findAll默认是支持递归查找的(recursive 默认值是 True);一般情况下这个参数不需要设置,除 非你真正了解自己需要哪些信息,而且抓取速度非常重要,那时你可以设置递归参数。

    d. 文本参数 text 有点不同,它是用标签的文本内容去匹配,而不是用标签的属性。假如我们 想查找前面网页中包含“the prince”内容的标签数量,我们可以把之前的 findAll 方法换 成下面的代码:

    nameList = bsObj.findAll(text="the prince")print(len(nameList))

    输出结果为“7”。

    e. 范围限制参数 limit,显然只用于 findAll 方法。find 其实等价于 findAll 的 limit 等于1 时的情形。如果你只对网页中获取的前 x 项结果感兴趣,就可以设置它。但是要注意, 这个参数设置之后,获得的前几项结果是按照网页上的顺序排序的,未必是你想要的那 前几项。

    还有一个关键词参数 keyword,可以让你选择那些具有指定属性的标签。功能有点多余。例如:

    allText = bsObj.findAll(id="text")

    print(allText[0].get_text())

    用 keyword 偶尔会出现问题,尤其是在用 class 属性查找标签的时候, 因为 class 是 Python 中受保护的关键字。也就是说,class 是 Python 语言 的保留字,在 Python 程序里是不能当作变量或参数名使用的(和前面介绍 的 BeautifulSoup.findAll() 里的 keyword 无关)。假如你运行下面的代码,Python 就会因为你误用 class 保留字而产生一个语法错误:

    bsObj.findAll(class="green")
    不过,你可以用 BeautifulSoup 提供的有点儿臃肿的方案,在 class 后面增加一个下划线:

    bsObj.findAll(class_="green")

    另外,你也可以用属性参数把 class 用引号包起来:

     bsObj.findAll("", {"class":"green"})

    2. 导航树:

    a. 子标签和后代标签

    b. 处理兄弟标签:

    BeautifulSoup 的 next_siblings() 函数可以让收集表格数据成为简单的事情,尤其是处理 带标题行的表格,让标签的选择更具体

    c. 父标签:

    偶尔在特殊情况下你也会用到BeautifulSoup 的父标签查找函数,parent 和 parents

    3.正则表达式:

    正则表达式,是因为它们可以识别正则字符串。例如邮箱:[A-Za-z0-9._+]+@[A-Za-z]+.(com|org|edu|net)

    在抓取网页的时候,BeautifulSoup 和正则表达式总是配合使用的。其实,大多数支 持字符串参数的函数(比如,find(id="aTagIdHere"))都可以用正则表达式实现。

    4. Lambda表达式:

    Lambda 表达式本质上就是一个函数,可以作为其他函数的变量使用,

    也就是说,一个函 数不是定义成 f(x, y),而是定义成 f(g(x), y),或 f(g(x), h(x)) 的形式。

  • 相关阅读:
    科大奥瑞大物实验-A类不确定度计算器 代码
    在手机和电脑间双向加密传输文件 —— Windows 安装 Kde Connect
    Leetcode 寻找两个有序数组的中位数
    树莓派3B安装 Arch Linux ARM
    从零开始编译安装 Extcalc
    Oracle, PostgreSQl, MySQL针对INSERT时可能唯一键重复的SQL
    如何从Oracle, MySql, PostgreSQL的PreparedStatement获得所执行的sql语句?
    PostgreSQL报错:当前事务被终止,命令被忽略,直到事务块结束
    PostgreSQL对GROUP BY子句使用常量的特殊限制
    一种用JDBC实现批量查询的巧妙方法
  • 原文地址:https://www.cnblogs.com/chengchengaqin/p/9507744.html
Copyright © 2011-2022 走看看