1. 程式人生 > >自學python爬蟲(五)BeautifulSoup庫的介紹

自學python爬蟲(五)BeautifulSoup庫的介紹

一、概念

BeautifulSoup是靈活又方便的網頁解析庫,處理高效。支援多種直譯器。利用它可以不用編寫正則表示式即可方便地實現網頁資訊的提取。

二、解析庫

這裡寫圖片描述

三、例項講解

下面用到的程式碼

html = """<html>
<head>
<title>關於軟體學院本科生開放實驗室註冊的通知-中南大學軟體學院</title><META Name="keywords" Content="中南大學,軟體學院,中南大學軟體學院,國家示範性軟體學院" />
<p class="title" name = "news
">
這是測試用的程式碼 <a href="#">這是一個假連結</a> </p> <p>Hello world!</p> """

下面是標籤選擇器的使用:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
# 格式化文字,缺少的部分補全
print(soup.prettify())
# 輸出title標籤
print(soup.title)
# 輸出title標籤的型別
print(type(soup.title))
#  輸出title標籤的內容
print(soup.title.string) # 輸出head print(soup.head) print(soup.p) # 獲取標籤名稱 print(soup.title.name) # 獲取屬性 print(soup.p.attrs['name']) print(soup.p['name']) # 巢狀選擇 print(soup.head.title.string) # 子節點,以list列表的形式給出 print(soup.p.contents) # 獲取子節點,以迭代器給出 print(soup.p.children) for i,child in enumerate(soup.p.children): print
(i,child) # 獲取所有的子孫節點 print(soup.p.descendants) for i,child in enumerate(soup.p.descendants): print(i,child) # 父節點 print(soup.a.parent) # 祖先節點 print(soup.a.parents) for i,parent in enumerate(soup.a.parents): print(i,parent) # 兄弟節點 print(list(enumerate(soup.a.next_siblings))) print(list(enumerate(soup.a.previous_siblings)))

下面是標準選擇器
find_all(name,attrs,recursive,text,**kwargs)可根據標籤名、屬性、內容查詢文件。find_all返回所有元素,find返回單個元素

print(soup.find_all('ul'))
print(type(soup.find_all('ul')[0]))
for ul in soup.find_all('ul'):
    print(ul.find_all('li'))
# attrs 傳入dict型別引數    
print(soup.find_all(attrs={'id':'list-1'}))
print(soup.find_all(attrs={'name':'elements'}))
# 或者這樣
print(soup.find_all(id='list-1'))
# class_
print(soup.find_all(class_='element'))
# text
print(soup.find_all(text='Foo'))
# find
print(soup.find('ul'))
print(type(soup.find('ul')))
#測試一個找不到的
print(soup.find('page'))

find_parents() 返回所有祖先節點find_parent()返回直接父節點;
find_next_siblings()返回所有兄弟節點,find_next_sibling()返回後面第一個兄弟節點;
find_previous_siblings()返回所有的兄弟節點,find_previous_sibling()返回前面第一個兄弟節點;
find_all_next() 返回所有符合條件的節點find_next()返回第一個符合條件的節點
find_all_prexious() 返回節點後所有符合條件的節點find_previous()返回第一個符合條件的節點。
下面是CSS選擇器
通過select()直接傳入CSS選擇器即可完成選擇。

# class 中間有空格
print(soup.select(' .panel .panel-heading'))
# 選擇標籤
print(soup.select('ul li'))
# id
print(soup.select('#list-2 .element'))
print(type(soup.select('ul')[0]))
for ul in soup.select('ul'):
    print(ul.select('li'))
# 獲取屬性
for ul in soup.select('ul'):
    print(ul['id'])
    print(ul.attrs['id'])
# 獲取內容
for li in soup.select('li'):
    print(li.get_text())

總結
1、推薦使用xml解析庫,必要時使用html.parse
2、標籤選擇篩選功能弱但是速度快
3、建議使用find()、find_all()查詢匹配單個結果或多個結果
4、如果對CSS選擇器熟悉建議使用select()
5、記住常用的獲取屬性和文字值得方法