beautifulsoup-使用方法

发布时间 2023-10-27 15:44:49作者: I我非柠檬为何心酸I
下载
pip install beautifulsoup4    # 国外 慢

pip install beautifulsoup4 -i http://pypi.douban.com/simple/  # 国外 快
导入
from bs4 import BeautifulSoup
对象实例化
soup = BeautifulSoup(html_doc,'lxml')
print(type(soup))
# <class 'bs4.BeautifulSoup'>
prettify 方法
# -----------------按照标准的缩进格式的结构输出  html进行美化 -----------------
# 方法 prettify
res = soup.prettify()
print(type(res))
# <class 'str'>

# 没什么可说的 一般就是为了方便看
find 方法
print(soup.title)
print(soup.div)
print(soup.p)
print(soup.a)
print(soup.img)
# soup对象.标签名
print(soup.asd) # 不存在则为None
# ---find--- 只获取一个,第一个。
print(soup.find('title'))
print(soup.title)
print(soup.find('div'))

# 要哪个标签就拿哪个标签,只获取一个,第一个
find 方法 条件查找
print(soup.find('a',class_="cover")) # 查找class为cover的a标签
print(soup.find('p',class_="detail"))# 查找class为detail的p标签
print(soup.find('span',id="icp"))   # 查找id为icp的span标签
print(soup.find('div',id="db-global-nav",class_="global-nav"))
print(soup.find('div',attrs={'id': "db-global-nav",'class': "global-nav"}))
find 方法 组合技
print(type(soup.find('a',class_="cover")))  #根据class属性找a标签,并查看返回类型
# <class 'bs4.element.Tag'>
print(soup.find('a',class_="cover").find('img')) # 前面的参数必须要满足是bs4对象才可以继续find
print(soup.find('a',class_="cover").img) # 也可以直接就.
print(soup.find('a',class_="cover").img.attrs) # 还可以
print(soup.find('a',class_="cover").img.attrs['src']) # 还可以
print(soup.find('a',class_="cover").img['src']) # 还可以

# 只要是bs4类型的可以继续find下去
attrs 方法
print(soup.div.attrs)
print(soup.div.attrs['id'])
print(soup.div.attrs['class'])
print(soup.div['class'])
print(soup.div['id'])
# 结果:
	 {'id': 'db-global-nav', 'class': ['global-nav']}
	 db-global-nav
	 ['global-nav']
	 ['global-nav']
	 db-global-nav

#  获取标签class与ID属性 
文件写入
print(soup.find('a',class_="cover").img) # 查看a标签class属性是cover 下面的所有img标签

with open('a_img','w',encoding='utf-8') as f:
    res = soup.find('a',class_="cover").img['src'] # 组合技,找到img标签,打印src的值
    f.write(str(res))  # 直接转换成字符串类型 写入文件
# bs4对象无法写入文件中,需要转成字符串才可以写入到文件当中。
获取文本 string、strings、text、get_text()、stripped_strings
# < title > 新书速递 < / title >
print(soup.title.string)
print(soup.title.strings) # 返回 生成器对象
print(list(soup.title.strings)) # 转换成list查看其中的内容
print(soup.title.text)
print(soup.title.get_text())
print(soup.title.stripped_strings) # 返回 生成器对象
print(list(soup.title.stripped_strings)) # 转换成list查看其中的内容
#总结,带有s的都是生成器,都能够正常的拿到文本,
结果:
	新书速递
	<generator object Tag._all_strings at 0x000002AD19BFBC80>
	['新书速递']
	新书速递
	新书速递
	<generator object PageElement.stripped_strings at 0x000002AD19BFBC80>
	['新书速递']
获取文本 方法的区别
print(soup.find('div',class_="detail-frame"))  # 查看div标签属性为class=detail-frame 
print(soup.find('div',class_="detail-frame").string)      # None

print(soup.find('div',class_="detail-frame").strings)      # <generator object Tag._all_strings at 0x0000027089EBAF90>
print(list(soup.find('div',class_="detail-frame").strings)) # list里面存在文本子孙数据

print(soup.find('div',class_="detail-frame").text)          # 拿到了子孙的数据 还有格式   是字符串类型 replace方法剔除空行空格
print(soup.find('div',class_="detail-frame").get_text())    # 同上

print(soup.find('div',class_="detail-frame").stripped_strings)
print(list(soup.find('div',class_="detail-frame").stripped_strings))  # 返回所有去除空白字符后的文本。  这个最舒服
find_all 方法
print(soup.find_all('img'))  # 返回一个list 能查找出所有html里面 标签是img的
print(soup.find_all('div',id= "db-global-nav",class_= "global-nav"))
print(soup.find_all('div',limit=2))
print(soup.find_all(['h2','img'])) # 获取h2和img标签
# 找所有,返回的list
select 方法
print(soup.select('img'))  # 查看所有的img 
print(soup.select('.cover')) # class  # 查找class属性为cover
print(soup.select('#db-global-nav'))  # id  
print(soup.select('.cover-col-4.clearfix')) 
print(soup.select('span[class="font-small color-lightgray"]'))
print(soup.select('.cover-col-4.clearfix > li img'))  # 递归向下查找
# select 查找所有 条件是选择器