Python网络爬虫入门笔记 八、提取信息

时间:2024-10-09 10:59:52

信息的提取有多种方法。

 

一、完整解析信息的标记形式,再提取关键信息

顾名思义,首先解析信息的标记形式,再提取需要的信息。

这种方法需要标记解析器,例如前面用到的BeautifulSoup库提供的标签树遍历。

优点:信息解析准确

缺点:提取信息繁琐,速度慢,也要求对信息的组织形式有一定的认识和了解。

 

二、无视标记形式,直接搜索关键信息

对信息的文本查找函数即可。

优点:提取过程简介,速度较快。

缺点:对提取结果缺乏准确性的定义,提取结果的准确性与讯息内容直接相关。

 

三、融合方法

1、概述

上述的方法各有优劣,一般情况下我们采用二者相融合的方法,即结合形式解析与搜索方法,提取关键信息。

既要用到标记解析器,也要用到文本查找函数。

 

2、引例

下面要实现这样一个功能,提取一个HTML文件中所有的URL链接。

思路:

  • 搜索到所有的<a>标签(HTML中用于存储URL链接的标签)
  • 解析<a>标签格式,提取href后的链接内容

实现代码如下:

首先用find_all()方法找出所有的<a>标签,随后输出这些标签中的"href"的值。

输出结果如下:

 

四、基于bs4库的HTML内容查找方法

BeautifulSoup库提供了一个方法:

<>.find_all(name,attrs,recursive,string,**kwarges)

这个方法可以在标签变量中查找相关信息,一共有五个参数,能够返回一个列表,存储相关的查找结果。

因为此方法过于常用,所以也可以简写为<>(…)

下面对各个变量进行解释:

 

1、name:对标签名称的检索字符串

(1)变量的使用

具体使用方法如下:

<>.find_all('标签名称')

此方法将会在标签变量的所有子孙标签中查找名称相符的标签,并将查找结果返回在一个列表中。

如果要同时查找两个标签,则需要使用如下形式:

<>.find_all(['名称1','名称2'])

此方法将会返回名称与名称1或名称2相符的标签组成的列表。若想一次查找更多,以此类推即可。

此外,标签名称也可以是布尔类型的True,此时指的是标签变量的所有子孙标签,一般用于循环语句之中。

(2)方法拓展

上述方法只能查找名称与指定名称完全相符的标签,在实际操作过程中,我们需要查找的可能是以某个字段开头的标签,这时就需要用到正则表达式库的帮助。这里给出一个例子。

引入的re库就是正则表达式库,执行上述代码就可以打印出所有以b开头的标签名称了。

 

2、attrs:对标签属性值的检索字符串,可标注属性检索

如果上面的方法是说按照标签的名称查找标签的话,用此变量就是通过标签的属性进行查找。

(1)变量的使用

上述代码中,我们在find_all()方法中添加了第二个参数,此时link中的内容就是名称为p,且属性中含有字符串'course'的标签列表。

此外,我们也可以通过直接指定某个属性的值进行查找:

上面的代码将会返回属性中id值为'link1'的标签的列表。

(2)方法扩展

同样,上面的方法查找标签必须精确的给出属性的值,如果只给出属性值得某个字段,将无法完成查找,由此,我们再次引入正则表达式库:

上述代码中,我们给出属性字段'link',就可以查找id值以'link'开头的所有标签。

 

3、recursive:是否对子孙全部检索,默认True

默认情况下,某一标签调用find_all()方法是对该标签所有子孙标签进行检索,如果只是想对标签的儿子标签进行检索,则需要指定:recursive = False

此参数较简单,不做过多叙述。

 

4、string:<>…</>中字符串区域的检索字符串

该变量是用于查找一对尖括号中间非属性字符串的,即一对尖括号中间的内容。

(1)变量的使用

上述代码我们就指定了string变量的值为'Basic Python',此时打印的link是个列表,列表中只有一个元素即'Basic Python',而当我们将给string的值去掉一个单词或是一个字母,那么返回的列表都将是一个空列表,因为无法找到与string值精确匹配的字符串。

 

(2)方法拓展

同样,上述方法在实际运用时无法满足实际需要,往往需要的是给定一个字符串,找出所有包含这个字符串的字符串。所以,还是要借助正则表达式的帮助。

上述代码给只给出了一个字符片段‘Py’,就可以找出所有含有’Py‘的非属性字符串,并返回一个列表。

 

注意!!!大小写是敏感的,比如用小写的‘python’和大写的‘Python’查找出的内容是不一样的。

 

5、扩展方法

这里再介绍一些内容查找的扩展方法:

方法

说明

<>.find()

搜索且只返回一个结果,字符串类型,同与<>.find_all()参数

<>.find_parents()

在先辈节点中搜索,返回列表类型,同<>.fin_all()参数

<>.find_parent()

在先辈节点中返回一个结果,字符串类型,同<>.find()参数

<>.find_next_siblings()

在后续平行节点中搜索,返回列表类型,同<>.find_all()参数

<>.find_next_sibling()

在后续平行节点中返回一个结果,字符串类型,同<>.find参数

<>.find_previous_siblings()

在前序平行节点中搜索,返回列表类型,同<>.find_all()参数

<>.find_previous_sibling()

在前序平行节点中返回一个结果,字符串类型,同<>.find()参数