SpringBoot+Swagger匯出HTML、MarkDown等離線檔案
阿新 • • 發佈:2020-12-19
一、介紹
Beautiful Soup 是一個可以從HTML或XML檔案中提取資料的Python庫.它能夠通過你喜歡的轉換器實現慣用的文件導航,查詢,修改文件的方式.Beautiful Soup會幫你節省數小時甚至數天的工作時間.目前已經開發到4.0以上了
baautifulsoup常用的解析器如下:
解析器 | 使用方法 | 優勢 | 劣勢 |
---|---|---|---|
Python標準庫 | BeautifulSoup(markup,"html.parser") |
|
|
lxml HTML 解析器 | BeautifulSoup(markup,"lxml") |
|
|
lxml XML 解析器 | BeautifulSoup(markup,["lxml","xml"]) BeautifulSoup(markup,"xml") |
|
|
html5lib | BeautifulSoup(markup,"html5lib") |
|
|
二、BeautifulSoup的使用
1、遍歷文件樹
遍歷文件樹:即直接通過標籤名字選擇,特點是選擇速度快,但如果存在多個相同的標籤則只返回第一個
# 1、用法: from bs4 import BeautifulSoup soup=BeautifulSoup(html_doc,'lxml') head=soup.head # print(head) # 2、獲取標籤的名字: 重點 p = soup.p print(p.name) #>: p # 3、獲取標籤的屬性 重點 p = soup.body.p # 獲取body下的p標籤 print(p.attrs) # 結果:{'id': 'my_p', 'class': ['title']} # 獲取p標籤內屬性值的三種方法 p.attrs.get('class') p.get('class') p['class'] # 4、獲取標籤的內容 重點 ''' text: 取所選標籤內下所有的文字內容 string: 若所選標籤下的文字只有一個時,取到,否則為None strings: 拿到一個生成器物件,取下所選標籤下的所有文字內容 stripped_strings: 是去掉空白 get_text():是用來調取內部屬性text的方法。 區別:string獲取的是該標籤的直系內容,無法獲取該標籤子標籤的直系內容, 而text/get_text()可以 注意:如果選標籤下包含多個節點,則string輸出結果是None,比如:body下有多個p節點 ''' p=soup.body.p print(p.text) print(p.string) print(p.strings) #結果:<generator object _all_strings at 0x0000026619237BF8> for line in p.stripped_strings: print(line) print(p.get_text()) # 5、巢狀選擇 重點 s = soup.body.a print(s.get('id')) # 6、子節點、子孫節點 print(soup.p.contents) #取出p下的所有子節點 print(soup.p.children) #取出包含p標籤下所有子節點,返回一個迭代器 print(list(soup.p.children)) # 7、父節點、祖先節點 print(soup.a.parent) #獲取a標籤的父節點(只有一個) print(soup.p.parent) #獲取p標籤的父節點 print(soup.a.parents) #返回生成器,找到a標籤所有的祖先節點,父親的父親,父親的父親的父親... print(list(soup.a.parents))#找到a標籤所有的祖先節點,父親的父親,父親的父親的父親... # 8、兄弟節點 print(soup.a.next_sibling) #下一個兄弟 print(soup.a.previous_sibling) #上一個兄弟 print(list(soup.a.next_siblings)) #下面的兄弟們=>生成器物件 print(list(soup.a.previous_siblings)) #上面的兄弟們=>生成器物件
2、搜尋文件樹
(1)find()和find_all()
'''
find_all(name , attrs , recursive , text , **kwargs)
用處:找到所有符合要求的標籤
引數:name是標籤名,attrs是一個字典引數,用來搜尋包含特殊屬性的標籤,比如:data-*型別的屬性
recursive:True,則會搜尋當前標籤的子孫節點,如果是False,則只搜尋當前標籤的子節點。
text: 可以是字元,列表,True,正則
注意:按類名查詢的時候,關鍵字是class_
'''
soup.find_all('a') #
soup.find(['a','p']) #找到所有a和p標籤
soup.find_all('a',limit=2) #找到前兩個a標籤
soup.find_all('a',attrs={'data-fooo':'value'})
soup.find_all('p',attrs={'class':'title'})
soup.find_all('p',recursive=False)
soup.find_all('a',text='Lacie')
soup.find_all(text='Lacie')
soup.find_all(class_='title')
'''
find_(name , attrs , recursive , text , **kwargs)
用處:找到第一個符合要求的標籤
引數:name是標籤名,attrs是一個字典引數,用來搜尋包含特殊屬性的標籤,比如:data-*型別的屬性
recursive:True,則會搜尋當前標籤的子孫節點,如果是False,則只搜尋當前標籤的子節點。
text: 可以是字元,列表,True,正則
注意:按類名查詢的時候,關鍵字是class_
'''
print(soup.find('a')) #尋找a標籤
print(soup.find('a',id='link3')) #尋找id是link3的a標籤
print(soup.find('a',class_='sister2'))
print(soup.find('a',title='xxx')) #尋找title是xxx的a標籤
'''
區別:find_all() 方法的返回結果是值包含一個元素的列表,而 find() 方法直接返回結果.
find_all() 方法沒有找到目標是返回空列表, find() 方法找不到目標時,返回 None
'''
(2)五種過濾器
'''
五種過濾器:字串、正則表示式、列表、True、方法
'''
# 1、字串:也就是標籤名
soup.find_all('b')
# 2、正則表示式
import re
soup.find_all(re.compile('^b')) #找b開頭的標籤
# 3、列表
soup.find_all(['a','p'])
# 4、True: 匹配任何值
soup.find_all(True) #查詢所有標籤,但是不會返回字串節點
# 5、方法:可以是自己定義的方法
def myfunc(tag):
return tag.has_attr('class') and not tag.has_attr('id')
soup.find_all(myfunc())
(3)css選擇器
'''
css選擇器:返回的是列表
'''
# 1、獲取標籤
print(soup.select('.element'))
print(soup.select('#link3'))
# 2、獲取標籤的屬性
soup.select('#link3')[0].attrs
# 3、獲取標籤的內容
soup.select('#link3')[0].get_text()
三國演義小說爬取案例:
# -*-coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import lxml
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
}
req=requests.get('http://www.shicimingju.com/book/sanguoyanyi.html',headers=headers)
soup=BeautifulSoup(req.text,'lxml')
li_list=soup.select('.book-mulu > ul > li > a')
for li in li_list:
url='http://www.shicimingju.com'+li['href']
title = li.string
req_detail=requests.get(url,headers=headers)
soup_detail=BeautifulSoup(req_detail.text,'lxml')
detail_text=soup_detail.find('div',class_='chapter_content').text
file_name=title+'.txt'
with open(file_name,'w',encoding='utf-8') as f:
f.write(detail_text)
print(title+' 載入完畢')
爬肯德基餐廳資訊(ajax請求,是post請求,返回的是資料)
# -*-coding:utf-8 -*-
import requests
import json
url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
}
# word=input(">>:")
data={
'cname': '',
'pid': '',
'keyword': '普寧',
'pageIndex': 1,
'pageSize': 10,
}
res=requests.post(url,data=data,headers=headers)
print(res.json())