Beautiful Soup简介(简称bs4)
它是一个可以从HTML或XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改文档的方式,节省工作时间
所有对象可以归纳为4种:
Tag:标签对象,例如<p class=”title”><b>yoyoketang</b></p>,这就是一个标签
NavigableString:字符对象,如:这里是我的微信公众号:yoyoketagn
BeautifulSoup:就是整个html对象
Comment:注释对象,如:!-- for HTML5 --,它其实就是一个特殊NavigableString
安装pip install beautifulsoup4
1、通过标签的名称,来获取tag对象,如果有多个相同的标签名称,返回的是第一个,soup.head
2、获取标签中的字符文本,soup.head.title.string
3、tag.attrs可以打印出所有的属性,返回字典格式的,获取其中的某个属性,跟操作字典一样,如:tag.attrs['href'] 或者 tag['href'],由于class属性一般可以为多个,中间空格 隔开,所以class属性获取的是一个list类型
4、查找元素,find_all查找所有符合要求的,返回的是一个list对象
5、get_text()获取tag标签下所有的文本
6、replace替换字符串里面的特殊字符
练习一
from bs4 import BeautifulSoup
htmldemo = '''
<meta charset="UTF-8"><!-- for HTML5 -->
<meta http-equiv="Content-Type" content="text/html:charset=utf-8" />
<html><head><title>yoyoketang</title></head>
<body>
<b><!--Hey,this in comment!--></b>
<p class="title"><b>yoyoketang</b></p>
<p class="yoyo">这里是我的微信公众号:yoyoketang<br>
<a href="http://www.cnblogs.com/yoyoketang/tag/fiddler/" class="sister name" id="link1"><m id='p'>la</m>fiddler教程</a><br>
<a href="http://www.cnblogs.com/yoyoketang/tag/python/" class="sister" id="link2">python笔记</a><br>
<a href="http://www.cnblogs.com/yoyoketang/tag/selenium/" class="sister" id="link3">selenium文档</a><br>
快来关注吧!</p>
<p class="story">...</p>
'''
#html.parser是解析器
soup = BeautifulSoup(htmldemo, 'html.parser')
#获取标签head
print(soup.head)
#获取字符
print(soup.head.title.string)
print(soup.a.attrs)
print(soup.a.attrs['href'])
print(soup.a['href'])
#根据class查找,不能直接用class查找 , class_='sister'
s = soup.find_all(class_='sister')
#二次查找
s2 = s[0].find_all(id='p')
#根据id查找
m = soup.find_all(id='link3')
#获取标签下的所有文本
t = soup.body.get_text()
练习二
from bs4 import BeautifulSoup
import requests
import os
#请求一个图片地址,获取其中所有的图片url和title
r = requests.get('http://699pic.com/sousuo-218808-13-1.html')
soup = BeautifulSoup(r.content, 'html.parser')
images = soup.find_all(class_='lazy')
curpath = os.path.dirname(os.path.realpath(__file__))
for i in images:
jpg_url = i['data-original']
title = i['title']
print(jpg_url)
print(title)
print('')
#下载获取到的图片,下载到curpath,名字title.jpg
with open(curpath+'\\'+title+'.jpg','wb') as f:
f.write(requests.get(jpg_url).content)