信息的提取有多种方法。
一、完整解析信息的标记形式,再提取关键信息
顾名思义,首先解析信息的标记形式,再提取需要的信息。
这种方法需要标记解析器,例如前面用到的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、扩展方法
这里再介绍一些内容查找的扩展方法:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|