自學python爬蟲(五)BeautifulSoup庫的介紹
阿新 • • 發佈:2018-11-06
一、概念
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、記住常用的獲取屬性和文字值得方法