python爬蟲學習(一):BeautifulSoup庫基礎及一般元素提取方法


最近在看爬蟲相關的東西,一方面是興趣,另一方面也是借學習爬蟲練習python的使用,推薦一個很好的入門教程:中國大學MOOC的《python網絡爬蟲與信息提取》,是由北京理工的副教授嵩天老師講的,感覺講的很清晰,課件也很詳細。

學習爬蟲,怎么也繞不開requests庫和BeautifulSoup庫,先說下BeautifulSoup庫:

BeautifulSoup庫通俗來說是【解析、遍歷、維護“標簽樹”(例如html、xml等格式的數據對象)的功能庫 】
一個簡單的使用BeautifulSoup庫的demo

# coding:utf-8

from bs4 import BeautifulSoup
import requests

url = 'http://python123.io/ws/demo.html'
r = requests.get(url)
demo = r.text  # 服務器返回響應

soup = BeautifulSoup(demo, "html.parser")
"""
demo 表示被解析的html格式的內容
html.parser表示解析用的解析器
"""
print(soup)  # 輸出響應的html對象
print(soup.prettify())  # 使用prettify()格式化顯示輸出

得到一個BeautifulSoup對象后,一般通過BeautifulSoup類的基本元素來提取html中的內容

2.提取html中的信息

 demo中的html內容如下:

(1)

print(soup.title)  # 獲取html的title標簽的信息
print(soup.a)  # 獲取html的a標簽的信息(soup.a默認獲取第一個a標簽,想獲取全部就用for循環去遍歷)
print(soup.a.name)   # 獲取a標簽的名字
print(soup.a.parent.name)   # a標簽的父標簽(上一級標簽)的名字
print(soup.a.parent.parent.name)  # a標簽的父標簽的父標簽的名字

(2)

print('a標簽類型是:', type(soup.a))   # 查看a標簽的類型
print('第一個a標簽的屬性是:', soup.a.attrs)  # 獲取a標簽的所有屬性(注意到格式是字典)
print('a標簽屬性的類型是:', type(soup.a.attrs))  # 查看a標簽屬性的類型
print('a標簽的class屬性是:', soup.a.attrs['class'])   # 因為是字典,通過字典的方式獲取a標簽的class屬性
print('a標簽的href屬性是:', soup.a.attrs['href'])   # 同樣,通過字典的方式獲取a標簽的href屬性

(3)

print('第一個a標簽的內容是:', soup.a.string)  # a標簽的非屬性字符串信息,表示尖括號之間的那部分字符串
print('a標簽的非屬性字符串的類型是:', type(soup.a.string))  # 查看標簽string字符串的類型
print('第一個p標簽的內容是:', soup.p.string)  # p標簽的字符串信息(注意p標簽中還有個b標簽,但是打印string時並未打印b標簽,說明string類型是可跨越多個標簽層次)

介紹一下find_all()方法:

常用通過find_all()方法來查找標簽元素:<>.find_all(name, attrs, recursive, string, **kwargs) 返回一個列表類型,存儲查找的結果 

 name:對標簽名稱的檢索字符串
• attrs對標簽屬性值的檢索字符串,可標注屬性檢索
• recursive是否對子孫全部檢索,默認True
• string:<>…</>中字符串區域的檢索字符串

(1)

print('所有a標簽的內容:', soup.find_all('a')) # 使用find_all()方法通過標簽名稱查找a標簽,返回的是一個列表類型
print('a標簽和b標簽的內容:', soup.find_all(['a', 'b']))  # 把a標簽和b標簽作為一個列表傳遞,可以一次找到a標簽和b標簽

(2)

for t in soup.find_all('a'):  # for循環遍歷所有a標簽,並把返回列表中的內容賦給t
      print('t的值是:', t)  # link得到的是標簽對象
      print('t的類型是:', type(t))
      print('a標簽中的href屬性是:', t.get('href'))  # 獲取a標簽中的url鏈接

(3)

for i in soup.find_all(True):  # 如果給出的標簽名稱是True,則找到所有標簽
    print('標簽名稱:', i.name)  # 打印標簽名稱

(4)

print('href屬性為http..的a標簽元素是:', soup.find_all('a', href='http://www.icourse163.org/course/BIT-268001'))  # 標注屬性檢索
print('class屬性為title的標簽元素是:', soup.find_all(class_='title'))  # 指定屬性,查找class屬性為title的標簽元素,注意因為class是python的關鍵字,所以這里需要加個下划線'_'
print('id屬性為link1的標簽元素是:', soup.find_all(id='link1'))  # 查找id屬性為link1的標簽元素

 (5)

print(soup.head)  # head標簽
print(soup.head.contents)   # head標簽的兒子標簽,contents返回的是列表類型
print(soup.body.contents)   # body標簽的兒子標簽
"""對於一個標簽的兒子節點,不僅包括標簽節點,也包括字符串節點,比如返回結果中的 \n"""

(6)

print(len(soup.body.contents))  # 獲得body標簽兒子節點的數量
print(soup.body.contents[1])   # 通過列表索引獲取第一個節點的內容

(7)

print(type(soup.body.children))  # children返回的是一個迭代對象,只能通過for循環來使用,不能直接通過索引來讀取其中的內容
for i in soup.body.children:   # 通過for循環遍歷body標簽的兒子節點
    print(i.name)   # 打印節點的名字

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM