基于BeautifulSoup库的HTML中信息提取

在上一篇中,提到了soup.<tag>中,例如soup.a,如果html中有多个a,则返回第一个a,所以可以用soup.find_all(a)找到所有a标签。

find_all有多个参数,.find_all(name, attrs, recursive, string, **kwargs),搜索当前所有tag子节点,并判断是否符合过滤器的条件

1. name 对标签名进行检索

(1)传入字符串

一般而言,就是传入标签名,比如检索a,怎找出全部的a标签,返回列表形式

(2)传入正则表达式

BeautifulSoup库会匹配所有符合正则表达式的标签,例如:

import re
for tag in soup.find_all(re.compile("^b")):
    print(tag.name)

(3)传入列表

 BeautifulSoup库会匹配列表中的任意一个元素的标签,返回所找标签内容,列表形式

soup.find_all(["a", "b"])

可以找出全部的a,b标签

(4)传入TRUE

此时会匹配任何值,即会查找到所有的tag,但是不会返回字符串节点

(5)据说还可以传自己需要的方法,以后再说

2. attrs对标签属性的检索字符串

(1)对于属性的检索,必须精确查找(准确赋值),不然,只能利用正则表达式来通过部分查找

例如,检索link时,就只会精确匹配link,但不会找link1

(2)如果搜索的属性是关键字,只要加个下划线,就可以正常使用了,例如,我们想用 class 过滤,不过 class 是 python 的关键词,加个下划线就可以。

(3)还有个例外(先留着这个坑,慢慢填坑)

3.text参数,string似乎也行,感觉同理

 通过 text 参数可以搜搜文档中的字符串内容.与 name 参数的可选值一样, text 参数接受 字符串 , 正则表达式 , 列表, True

4.limit参数

让limit=某个数字,即限定返回多少结果,避免返回结果过多卡死

5. recursive参数,是否对子孙全部检索,默认TRUE

6.<tag>(..)等价于<tag>.find_all(...)

  soup(...)等价于soup.find_all(...)

其他类似方法如下:

 

 

 

 

 

posted @ 2017-08-22 17:10  shapeofu  阅读(975)  评论(0编辑  收藏  举报