BeautifulSoup和pyquery都是用來解析html的庫,與昨天學的XPath有不少類似之處,所以就將這兩個庫放在一塊兒學習html
基本用法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
關於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的有關內容,由於接下來打算作一個和淘寶有關的項目,須要瞭解動態加載的內容。