基于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(...)
其他类似方法如下: