Python爬蟲學習筆記(六)——BeautifulSoup和pyquery的使用

介紹

BeautifulSoup和pyquery都是用來解析html的庫,與昨天學的XPath有不少類似之處,所以就將這兩個庫放在一塊兒學習html

BeautifulSoup庫

基本用法ajax

from bs4 import BeautifulSoup

html = #略
# 初始化BeautifulSoup,第二個參數表示解釋器爲lxml
soup = BeautifulSoup(html, 'lxml')
# prettify()方法能夠標準化html的縮進格式
print(soup.prettify())
#

節點選擇器正則表達式

直接調用節點的名稱就能夠選擇節點元素,例如soup.div就是選擇第一個div節點 通過選擇器選擇後,選擇結果都是bs4.element.Tag類型,這是這個庫裏一個重要的數據結構 Tag類型一樣能夠繼續調用節點進行下一步的選擇,例如soup.div.ul,也就是說能夠嵌套選擇,選擇後的結果依然是Tag類型數據結構

關於Tag類,有幾個經常使用的屬性介紹一下學習

# 節點的文本內容
soup.div.string
# 節點的名稱
soup.div.name
# 節點的屬性
soup.div.attrs

其中string和name都是str類型,而attrs是dict類型,由於節點可能會有多個屬性。 屬性的類型也不必定都是str類型,有的返回結果是字符串組成的列表,例如class屬性,一個節點元素可能有多個class。ui

此外,再介紹一下如何選中關聯節點。url

# 子節點,返回結果是列表形式,包含節點和文本
soup.p.contents
# 子節點,返回結果是生成器,須要遍歷輸出
soup.p.children
# 子孫節點,返回結果是生成器,須要遍歷輸出
soup.p.descendants
# 父節點
soup.p.parent
# 祖先節點
soup.p.parents
# 兄弟節點
## 後一個兄弟節點
soup.p.next_sibling
## 後面的全部兄弟節點
soup.p.next_siblings
## 前一個兄弟節點
soup.p.previous_sibling
## 前面的全部兄弟節點
soup.p.previous_siblings

這些關聯節點返回不全是Tag類型,可是有相同的屬性,因此能夠用相同的方式查詢屬性spa

方法選擇器code

  • find_all() 這個方法的API以下:find_all(name, attrs, recursive, text, **kwargs) 第一個屬性是節點名,返回結果是列表類型,其元素是Tag類型 第二個是屬性,返回結果是列表類型,其元素是Tag類型 第三個是文本,傳入類型能夠是字符串,也能夠是正則表達式對象,返回結果是列表類型,其元素是str類型
  • find() 返回單個元素,其他相似find_all()方法
  • find_parents()和find_parent()
  • find_next_siblings()和find_next_sibling()
  • find_previous_siblings()和find_previous_sibling()

pyquery庫

關於BeautifulSoup,其實還有CSS選擇器部分沒介紹,可是pyquery的CSS選擇器更增強大,所以就直接介紹pyquery吧xml

初始化

相似於bs,初始化pyquery的時候,也須要傳入HTML來初始化一個PyQuery對象。它的初始化方式有多種,能夠直接傳入字符串,能夠傳入URL,能夠傳入HTML文件等

from pyquery import PyQuery as pq

doc = pq(html)
doc = pq(url='https://cuiqingcai.com')
doc = pq(filename='deme.html')

查找節點

# 選取class爲list的節點
items = doc('.list')
# 子節點
lis = items.children()
# class爲active的子節點
lis = items.children('.active')
# 傳入CSS選擇器,選取爲li的子孫節點
lis = items.find('li')
# 父節點
lis = items.parent()
# 祖先節點,若是須要篩選,也能夠傳入CSS選擇器
container = items.parents()
# 兄弟節點
lis = ltems.siblings()

遍歷

pyquery的選擇結果多是多個節點,類型都是PyQuery類型,因此須要遍從來獲取。這時候須要調用item()方法

lis = doc('li').item()
for li in lis:
    print(li)

獲取信息

相似於bs,這裏用attrs()來獲取屬性,用text()來獲取文本 但若是想獲取HTML文本,須要調用html()方法

節點操做

pyquery提供了一系列方法來對節點進行動態修改,這裏就介紹一些經常使用的方法

li = doc('item-0.active')
# 刪除class屬性
li.removeClass('active')
# 添加class屬性
li.addClass('active')
# 改變屬性
li.attr('name', 'link')
# 改變文本內容
li.text(str)
# 改變html
li.html(html)
# 移除節點
li.remove()

僞類選擇器

# 第一個li節點
li = doc('li:first-hild')
# 最後一個li節點
li = doc('li:last-child')
# 第二個li節點
li = doc('li:nth-child(2)')
# 第三個li以後的li節點
li = doc('li:gt(2)')
# 偶數位置的li節點
li = doc('li:nth-child(2n)')
# 包含second文本的li節點
li = doc('li:contains(second)')

總結

關於HTML解析庫的內容,基本上就所有介紹完了,經過這些內容,基本能夠解決HTML的解析了。 接下來打算跳過書本的第五章,直接學習ajax的有關內容,由於接下來打算作一個和淘寶有關的項目,須要瞭解動態加載的內容。

相關文章
相關標籤/搜索