Beautiful Soup 是一個可以從HTML或XML文件中提取數據的Python庫。bs4 模塊的 BeautifulSoup 配合requests庫可以寫簡單的爬蟲。
安裝
- 命令:pip install beautifulsoup4
解析器
- 主要的解析器,以及它們的優缺點如下:

安裝命令:
- pip install lxml
- pip install html5lib
requests
- requests的底層實現就是urllib, requests能夠自動幫助我們解壓(gzip壓縮的等)網頁內容
- 安裝命令:pip install requests
- 推薦使用 response.content.deocde() 的方式獲取響應的html頁面
pandas
- 安裝命令:pip install pandas
- 基於NumPy 的一種工具,該工具是為了解決數據分析任務而創建的。
數據結構:
- Series:一維數組,與Numpy中的一維array類似。二者與Python基本的數據結構List也很相近,其區別是:List中的元素可以是不同的數據類型,而Array和Series中則只允許存儲相同的數據類型,這樣可以更有效的使用內存,提高運算效率。
- Time- Series:以時間為索引的Series。
- DataFrame:二維的表格型數據結構。很多功能與R中的data.frame類似。可以將DataFrame理解為Series的容器。以下的內容主要以DataFrame為主。
- Panel :三維的數組,可以理解為DataFrame的容器。
使用
Beautiful Soup將復雜HTML文檔轉換成一個復雜的樹形結構,每個節點都是Python對象,所有對象可以歸納為4種:
- Tag
- NavigableString
- BeautifulSoup
- Comment
Tag:Tag 對象與XML或HTML原生文檔中的tag相同,tag中最重要的屬性: name和attributes
從網頁中獲取指定標簽、屬性值,取值方式:
- 通過標簽名獲取:tag.name tag對應的type是<class 'bs4.element.Tag'>
- 通過屬性獲取:tag.attrs
- 獲取標簽屬性:tag.get('屬性名') 或 tag['屬性名']
功能標簽
- stripped_strings:輸出的字符串中可能包含了很多空格或空行,使用 .stripped_strings 可以去除多余空白內容
- 標准輸出頁面:soup.prettify()
查找元素:
- find_all(class_="class") 返回的是多個標簽
- find(class_="class") 返回一個標簽
- select_one() 返回一個標簽
- select() 返回的是多個標簽
- soup = BeautifulSoup(backdata,'html.parser') #轉換為BeautifulSoup形式屬性
- soup.find_all('標簽名',attrs{'屬性名':'屬性值'} ) #返回的是列表
- limitk 控制 find_all 返回的數量
- recursive=Flase 返回tag的直接子元素
demo
import sys
import io
import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
import numpy as np
from py_teldcore import sqlserver_db as db
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030')
url = "http://www.tianqihoubao.com/lishi/hefei/month/201812.html"
def get_soap():
try:
r = requests.get(url)
soap = bs(r.text, "lxml")
return soap
except Exception as e:
print(e)
return "Request Error"
def save2cvs(data, path):
result_weather = pd.DataFrame(data, columns=['date', 'tq', 'temp', 'wind'])
result_weather.to_csv(path, encoding='gbk')
print('save weather sucess')
def save2mssql(data):
sql = "Insert into Weather(date, tq, temp, wind) values(%s, %s, %s, %s)"
data_list = np.ndarray.tolist(data)
# sqlvalues = list()
# for data in data_list:
# sqlvalues.append(tuple(data))
sqlvalues = [tuple(iq) for iq in data_list]
try:
db.exec_sqlmany(sql, sqlvalues)
except Exception as e:
print(e)
def get_data():
soap = get_soap()
print(soap)
all_weather = soap.find("div", class_="wdetail").find("table").find_all("tr")
data = list()
for tr in all_weather[1:]:
td_li = tr.find_all("td")
for td in td_li:
s = td.get_text()
data.append("".join(s.split()))
res = np.array(data).reshape(-1, 4)
return res
if __name__ == "__main__":
data = get_data()
save2mssql(data)
print("save2 Sqlserver ok!")
參考資料
