python bs4 BeautifulSoup

Beautiful Soup 是一個能夠從HTML或XML文件中提取數據的Python庫。bs4 模塊的 BeautifulSoup 配合requests庫能夠寫簡單的爬蟲。html

安裝html5


  • 命令pip install beautifulsoup4 

解析器python


  • 主要的解析器,以及它們的優缺點以下:

安裝命令:sql

  • pip install lxml
  • pip install html5lib

requests數組


  •  requests的底層實現就是urllib, requests可以自動幫助咱們解壓(gzip壓縮的等)網頁內容
  • 安裝命令:pip install requests
  • 推薦使用 response.content.deocde() 的方式獲取響應的html頁面

pandas數據結構


  • 安裝命令:pip install pandas 
  • 基於NumPy 的一種工具,該工具是爲了解決數據分析任務而建立的。

 數據結構:app

  • 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種:sqlserver

  • Tag 
  • NavigableString 
  • BeautifulSoup 
  • Comment 

Tag:Tag 對象與XML或HTML原生文檔中的tag相同,tag中最重要的屬性: name和attributesurl

 

從網頁中獲取指定標籤、屬性值,取值方式:

  • 經過標籤名獲取: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!")

  

 

參考資料


相關文章
相關標籤/搜索