爬虫学习(三)---基于bs4的信息提取

find_all()函数的使用

# 返回一个列表类型,存储查找的结果
find_all(name, attrs, recursive, string, **kwargs)
soup.find_all() 也可以为 soup()
参数 意义
name 对标签名称检索的字符串, 例如:‘a’ , ‘p’ , …
attrs 对标签属性值的检索字符串,可标注属性检索
recursive bool类型,是否对子孙全部检索,缺省值为 True
string 标签中字符串区域的检索字符串

1.对标签名称检索的字符串的查找实例

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.baidu.com")
r.encoding = r.apparent_encoding
demo = r.text
soup = BeautifulSoup(demo,  "html.parser")

print("只对 ’p‘ 标签进行查找")
for link in soup.find_all('p'):
    print(link.name, end="")

print("\n\n同时对 ’a‘ 和 ’p‘ 标签进行查找")
for link in soup.find_all(['a', 'p']):
    print(link.name, end="")

# 运行结果
# 只对 ’p‘ 标签进行查找
# pp
# 
# 同时对 ’a‘ 和 ’p‘ 标签进行查找
# aaaaaaapaapaa

2.对标签属性值的检索字符串的查找实例

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.baidu.com")
r.encoding = r.apparent_encoding
demo = r.text
soup = BeautifulSoup(demo,  "html.parser")

print("对 ’a‘ 标签进行查找")
for link in soup.find_all('a'):
    print(link)

print("\n对 ’a‘ 标签中含有 ’bri‘ 属性值的标签进行查找")  # 即class 这个键域中的值
for link in soup.find_all('a', 'bri'):
    print(link)
    
# 运行结果
# 对 ’a‘ 标签进行查找
# <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
# <a class="mnav" href="https://www.hao123.com" name="tj_trhao123">hao123</a>
# <a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a>
# <a class="mnav" href="http://v.baidu.com" name="tj_trvideo">视频</a>
# <a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">贴吧</a>
# <a class="lb" href="http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1" name="tj_login">登录</a>
# <a class="bri" href="//www.baidu.com/more/" name="tj_briicon" style="display: block;">更多产品</a>
# <a href="http://home.baidu.com">关于百度</a>
# <a href="http://ir.baidu.com">About Baidu</a>
# <a href="http://www.baidu.com/duty/">使用百度前必读</a>
# <a class="cp-feedback" href="http://jianyi.baidu.com/">意见反馈</a>
# 
# 对 ’a‘ 标签中含有 ’bri‘ 属性值的标签进行查找
# <a class="bri" href="//www.baidu.com/more/" name="tj_briicon" style="display: block;">更多产品</a>

3.recursive 中 的False实例

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.baidu.com")
r.encoding = r.apparent_encoding
demo = r.text
soup = BeautifulSoup(demo,  "html.parser")

print('对 ’html‘ 标签的True:')
for link in soup.find_all('html'):
    print(link.name)

print('\n对 ’html‘ 标签的False:')
for link in soup.find_all('html', recursive=False):
    print(link.name)

print('对 ’body‘ 标签的True:')
for link in soup.find_all('body'):
    print(link.name)

print('\n对 ’body‘ 标签的False:')
for link in soup.find_all('body', recursive=False):
    print(link)

# 运行结果 可以看到对当前根节点的’html‘是正常的,’body‘是检测不到的
# 对 ’html‘ 标签的True:
# html
# 
# 对 ’html‘ 标签的False:
# html
# 对 ’body‘ 标签的True:
# body
#
# 对 ’body‘ 标签的False:

4.通过string参数查找相关内容的实例

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.baidu.com")
r.encoding = r.apparent_encoding
demo = r.text
soup = BeautifulSoup(demo,  "html.parser")

print("打印所有a标签:")
for link in soup.find_all('a'):
    print(link)

print("\n打印a标签中字符串域中包含’关于百度‘ 这几个的链接:")
for link in soup.find_all('a', string='关于百度'):
    print(link)

# 运行结果
打印所有a标签:
# <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
# <a class="mnav" href="https://www.hao123.com" name="tj_trhao123">hao123</a>
# <a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a>
# <a class="mnav" href="http://v.baidu.com" name="tj_trvideo">视频</a>
# <a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">贴吧</a>
# <a class="lb" href="http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1" name="tj_login">登录</a>
# <a class="bri" href="//www.baidu.com/more/" name="tj_briicon" style="display: block;">更多产品</a>
# <a href="http://home.baidu.com">关于百度</a>
# <a href="http://ir.baidu.com">About Baidu</a>
# <a href="http://www.baidu.com/duty/">使用百度前必读</a>
# <a class="cp-feedback" href="http://jianyi.baidu.com/">意见反馈</a>
# 
# 打印a标签中字符串域中包含’关于百度‘ 这几个的链接:
# <a href="http://home.baidu.com">关于百度</a>

5.几种扩展方法

函数 说明
find() 搜索且只返回一个结果,字符串类型
find_parents() 在祖先节点中搜索,返回列表类型
find_parent() 在祖先节点返回一个结果,字符串类型
find_next_siblings() 在后续平行节点中搜索, 返回列表类型
find_next_sibling() 在后续平行节点中返回一个结果,字符串类型
find_previous_siblings() 在前续平行节点中搜索 ,返回列表类型
find_previous_sibling() 在前续平行节点中返回一个结果,字符串类型

这里用find()举个例子,后面都可以靠举一反三去实现

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.baidu.com")
r.encoding = r.apparent_encoding
demo = r.text
soup = BeautifulSoup(demo,  "html.parser")

print("对每个 ’p‘ 标签中的所有’a‘标签进行打印")
for line in soup('p'):
    print(line.find_all('a'))

print("\n对每个 ’p‘ 标签中的第一个’a‘标签进行打印")
for line in soup('p'):
    print(line.find('a'))
    
# 运行结果
# 对每个 ’p‘ 标签中的所有’a‘标签进行打印
# [<a href="http://home.baidu.com">关于百度</a>, <a href="http://ir.baidu.com">About Baidu</a>]
# [<a href="http://www.baidu.com/duty/">使用百度前必读</a>, <a class="cp-feedback" href="http://jianyi.baidu.com/">意见反馈</a>]
# 
# 对每个 ’p‘ 标签中的第一个’a‘标签进行打印
# <a href="http://home.baidu.com">关于百度</a>
# <a href="http://www.baidu.com/duty/">使用百度前必读</a>

发布了145 篇原创文章 · 获赞 22 · 访问量 9640

猜你喜欢

转载自blog.csdn.net/weixin_44778155/article/details/104469497