安装: pip install beautifulsoup4
查看是否安装成功:pip show beautifulsoup4 或者 pip list
soup = BeautifulSoup(markup, “html.parser”) #python标准库, 获取的整个html对象
其他解析器:lxml, lxml-xml, xml, html5lib
print(soup.prettify()) #转换成有层级关系的格式
所有对象可归纳为4种:
Tag:标签对象
NavigableString:字符对象
BeautifulSoup: 整个html对象
Comment:注释对象
一、获取整个标签:
soup.标签名字
如获取title标签:soup.title, 获取结果带标签名字
注意:有多个标签名字的时候,只返回第一个,获取所有的需要用find_all()
二、获取多个同名标签:
用find_all()
all = soup.find_all(“a”) #获取所有的a标签 #可以填写属性find_all(class_=”content”)
print(all)
for i in all:
print(i)
三、获取标签内的标签:
soup.标签名字(父).标签名字(子), 如:soup.p.b
四、获取标签中的字符串:
soup.标签名字.string如:soup.p.string
五、获取标签中的属性:
soup.a.attrs (a标签中含有href=”xxx”的属性)
1.先通过a.attrs转换成字典,通过字典的键获取,从而获取属性的值
class属性不唯一,返回的是列表
2.直接通过属性获取,如:a[“href”],不需要转字典。
六、获取所有子孙节点的字符串:
标签.get_text()
返回的是list。
实例1:获取文本
思路:获取整个html;用属性去查找全部符合条件的list对象;用for循环打印出class标签下的span标签下的字符串print(i.span.get_text())
1 # coding:utf-8 2 from bs4 import BeautifulSoup 3 import requests 4 5 url = 'https://www.qiushibaike.com/' 6 r = requests.get(url) 7 # print(r.content.decode("utf-8")) 8 soup = BeautifulSoup(r.content, "html.parser") 9 # print(soup.prettify()) 10 all = soup.find_all(class_="recmd-content") # 查找的是class_="recmd-content"的list对象,打印结果带有class标签 11 # print(all) 12 for i in all: 13 print(i.span.get_text().replace("\n", "")) # get_text()获取标签下所有文本,获取当前节点下,子孙节点字符串,然后把空行去掉
实例2:下载图片
思路:获取整个html;用属性去查找全部符合条件的list对象;用for循环打印出class标签下img标签页的title和链接:print(i["title"]), print(i["data-original"]); 用try…except做处理,找到即打印出来,没有就pass;最后对图片进行存储处理
1 # coding:utf-8 2 from bs4 import BeautifulSoup 3 import requests 4 import os 5 6 url = 'http://699pic.com/sousuo-218808-13-1-0-0-0.html' 7 r = requests.get(url) 8 # print(r.content.decode("utf-8")) 9 soup = BeautifulSoup(r.content, "html.parser") #获取整个html对象 10 # print(soup.prettify()) 11 all = soup.find_all(class_="lazy") # 查找的是class_="lazy"的list对象,打印结果带有class属性的img标签,里边有链接 12 # print(all) 13 cur_path = os.path.dirname(os.path.realpath(__file__)) #当前文件所在路径 14 pic_path = os.path.join(cur_path, "pic") #路径连接存放图片,需先新建pic文件夹 15 print(pic_path) 16 for i in all: 17 try: 18 pic_title = i["title"] #img标签的对象 通过属性的key获取值 19 print(pic_title) 20 pic_url = i["data-original"] 21 print(pic_url) # get_text()获取标签下所有文本,获取当前节点下,子孙节点字符串,然后把空行去掉 22 r2 = requests.get(pic_url) #请求图片的url地址,以得到二进制内容 23 with open(pic_path+"\\"+pic_title+".jpg", "wb") as f: #存放图片的文件夹,连接图片title,以写入方法打开 24 f.write(r2.content) #请求地址得到的二进制内容写进文件 25 except: 26 pass