爬蟲之解析庫BeautifulSoup

介紹

Beautiful Soup是python的一個庫,最主要的功能是從網頁抓取數據。官方解釋以下:html

Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,經過解析文檔爲用戶提供須要抓取的數據,由於簡單,因此不須要多少代碼就能夠寫出一個完整的應用程序。

Beautiful Soup自動將輸入文檔轉換爲Unicode編碼,輸出文檔轉換爲utf-8編碼。你不須要考慮編碼方式,除非文檔沒有指定一個編碼方式,這時,Beautiful Soup就不能自動識別編碼方式了。而後,你僅僅須要說明一下原始編碼方式就能夠了。

Beautiful Soup已成爲和lxml、html6lib同樣出色的python解釋器,爲用戶靈活地提供不一樣的解析策略或強勁的速度。

使用方法

(1) 根據標籤名查找
    - suop.a 只能找到第一個符合要求的標籤
(2) 獲取屬性值
    - suop.a.attrs         獲取a全部的屬性和屬性值,返回一個字典
    - suop.a.attrs["href"] 獲取href屬性值
    - suop.a["href"]       簡寫爲這種形式
(3) 獲取內容
    - suop.a.string        獲取標籤中直系的文本內容
    - suop.a.text          獲取全部標籤中的文本內容
    - suop.a.get_text()    獲取全部標籤中的文本內容
   【注意】若是標籤中還有標籤,那麼string獲取到的結果爲None,其餘兩個方法能夠獲取到文本內容
(4) find 找到第一個符合要求的標籤
    - suop.find("a")       找到第一個符合要求的
    # 根據標籤中的屬性獲取指定的a標籤
    - suop.find("a", class_="xxx")  # class是關鍵字須要加_
    - suop.find("a", id="xxx")
    - suop.find("a", href="xxx")
    - suop.find("a", alt="xxx")
    - suop.find("a", tetle="xxx")
    # 能夠和獲取內容的方法連用
    - suop.find("a",href="/hecheng/27.html").text
(5) find_all 找到全部符合要求的標籤
    - suop.find_all("a")
    - suop.find_all(["a","p"])  找到全部a標籤和p標籤
    - suop.find_all(["a","p"],limit=2)   取前兩個
(6) 根據選擇器選擇指定的內容
    select:suop.select("#id")
    - 常見的選擇器:標籤選擇器(a)|類選擇器(.)|id選擇器(#)|層級選擇器
    - 層級選擇器:
        div .mm         div下面全部class屬性值爲mm的,子子孫孫,下面多級
        div > .dd       div兒子級class屬性爲dd的,下面一級
    【注意】查詢到的是全部數據,返回列表

項目演示

import requests
import lxml
from bs4 import BeautifulSoup
url = "http://www.shicimingju.com/book/sanguoyanyi.html"
response = requests.get(url).text 
suop = BeautifulSoup(response,'lxml') # 實例化對象,使用lxml進行解析
a_list = suop.select('.book-mulu > ul > li > a')
url = "http://www.shicimingju.com"
for a in a_list:
    fiction_name = a.string   # 小說章節名稱
    fiction_url = url+a["href"]  # 小說章節url地址
    response = requests.get(fiction_url).text  # 請求每一個章節的url地址
    suop = BeautifulSoup(response,'lxml')
    content = suop.find("div",class_="chapter_content").text  # 獲取標籤內全部文本數據
    with open("./{}.txt".format(fiction_name),"w",encoding="utf-8") as fp:
        fp.write(content)
print("下載成功!!!")

select選擇器選擇a標籤中的文本內容和gref屬性

效果

相關文章
相關標籤/搜索