python網絡爬蟲(5)BeautifulSoup的使用示範

建立並顯示原始內容

其中的lxml第三方解釋器加快解析速度html

import bs4
from bs4 import BeautifulSoup
html_str = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,
<a href="http://example.com/lacie" class="sister" id="link2"><!-- Lacie --></a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
soup = BeautifulSoup(html_str,'lxml')
print(soup.prettify())

控制檯顯示出soup須要處理的內容:html5

 

提取對象內容和屬性

搜索包括了全部的標籤。默認提取第一個符合條件的標籤。python

提取Tag對象

其中,name用於顯示標籤名,去掉name則內容直接顯示。正則表達式

print(soup.name)
print(soup.title.name)
print(soup.title)
print(soup.a)

控制檯輸出效果以下:數組

顯示屬性

attrs用於顯示屬性。class用於顯示選中的標籤Tag中的類名。3d

print(soup.p['class'])
print(soup.p.attrs)

輸出結果:orm

內容文字

顯示標記中的文字,NavigableString類型xml

print(soup.p.string)
print(type(soup.p.string))

效果:htm

顯示註釋

顯示註釋內容,注意與普通string的區別在於最後的類,用於數據分類對象

print(soup.a.string)
print(type(soup.a.string))

 

文檔相關結點

直接子節點數組

結點中的contents輸出直接子節點數組,能夠經過for逐個輸出,經過string屬性直接輸出內容

print(soup.body.contents)

輸出body標籤下的直接子節點:

結點children輸出直接子節點,和contents相似。不同的是返回了生成器,一點參考:http://www.javashuo.com/article/p-mtrdznhr-kw.html

for i in soup.body.children:
    print(i,end='')

添加了end=''用於去掉print的自動換行

子、孫節點

結點descendants能夠輸出子節點和孫節點

for i in soup.body.descendants:
    print(i)

效果:

節點strings輸出所有子節點內容值

print(soup.strings)
print('------------------------') for text in soup.strings: print(text,end='')

效果:

節點stripped_strings輸出所有內容並去掉回車和空格

for text in soup.stripped_strings:
    print(text)

print每次輸出加上換行後,效果:

父節點相關

父節點parent

print(soup.title)
print(soup.title.parent)

效果:

父輩節點parents,這裏只輸出名字就行了,不然內容過多

for i in soup.a.parents:
    print(i.name)

效果:

兄弟節點等

兄弟節點next_sibling,previous_sibling,另有 :next_siblings,previous_siblings

print(soup.p.next_sibling.next_sibling)
print(soup.p.previous_sibling)

效果:

先後節點:next_element,next_elements等......

 

BeautifulSoup的搜索方法

包括了find_all,find,find_parents等等,這裏只舉例find_all。

find_all中參數name查找名稱標記

查找全部b標籤

print(soup.find_all('b'))

輸出:

查找全部b開頭的標籤

配合正則表達式使用

import re
for tag in soup.find_all(re.compile("^b")):
    print(tag.name)

輸出:

查找a開頭和b開頭的標籤

print(soup.find_all(["a", "b"]))

輸出:(一個數組,過長)

查找全部標籤,True能夠匹配任何值

for tag in soup.find_all(True):
  print(tag.name)

輸出:

自定義過濾

查找含有class和id屬性的Tag標籤

def hasClass_Id(tag):
    return tag.has_attr('class') and tag.has_attr('id')
print(soup.find_all(hasClass_Id))

效果:

查找關鍵詞參數kwargs並輸出

查找id參數爲link2的標籤

print(soup.find_all(id='link2'))

輸出:

查找連接中含有elsie的標籤

配合正則表達式

print(soup.find_all(href=re.compile("elsie")))

輸出:

查找全部有id屬性的標籤

print(soup.find_all(id=True))

輸出:

查找全部a標籤且class內容爲sister

print(soup.find_all("a", class_="sister"))

輸出:

查找全部連接含有elsie的標籤,id爲link1

print(soup.find_all(href=re.compile("elsie"), id='link1'))

輸出:

不能表達的屬性的解決方案

在html5中有些屬性不被支持,查找時,經過定義字典實現輸出

data_soup = BeautifulSoup('<div data-foo="value">foo!</div>','lxml')
print(data_soup.find_all(attrs={"data-foo": "value"}))

輸出:

經過text參數查找文本內容並過濾

 輸入:

print(soup.find_all(text=["Tillie", "Elsie", "Lacie"]))
print(soup.find_all(text=re.compile("Dormouse")))

輸出:

經過limit參數限制查找數量

輸入:

print(soup.find_all("a", limit=2))

輸出只有兩個:

經過recursive參數只查找直接子節點

soup位於根處

print(soup.find_all("title"))
print(soup.find_all("title", recursive=False))

輸出:

使用CSS選擇器查找

#直接查找title標籤
print soup.select("title")
#逐層查找title標籤
print soup.select("html head title")
#查找直接子節點
#查找head下的title標籤
print soup.select("head > title")
#查找p下的id="link1"的標籤
print soup.select("p > #link1")
#查找兄弟節點
#查找id="link1"以後class=sisiter的全部兄弟標籤
print soup.select("#link1 ~ .sister")
#查找緊跟着id="link1"以後class=sisiter的子標籤
print soup.select("#link1 + .sister")

print soup.select(".sister")
print soup.select("[class~=sister]")

print soup.select("#link1")
print soup.select("a#link2")

print soup.select('a[href]')

print soup.select('a[href="http://example.com/elsie"]')
print soup.select('a[href^="http://example.com/"]')
print soup.select('a[href$="tillie"]')
print soup.select('a[href*=".com/el"]')

 輸出:

相關文章
相關標籤/搜索