其中的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
其中,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等......
包括了find_all,find,find_parents等等,這裏只舉例find_all。
print(soup.find_all('b'))
輸出:
配合正則表達式使用
import re for tag in soup.find_all(re.compile("^b")): print(tag.name)
輸出:
print(soup.find_all(["a", "b"]))
輸出:(一個數組,過長)
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))
效果:
print(soup.find_all(id='link2'))
輸出:
配合正則表達式
print(soup.find_all(href=re.compile("elsie")))
輸出:
print(soup.find_all(id=True))
輸出:
print(soup.find_all("a", class_="sister"))
輸出:
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"}))
輸出:
輸入:
print(soup.find_all(text=["Tillie", "Elsie", "Lacie"])) print(soup.find_all(text=re.compile("Dormouse")))
輸出:
輸入:
print(soup.find_all("a", limit=2))
輸出只有兩個:
soup位於根處
print(soup.find_all("title")) print(soup.find_all("title", recursive=False))
輸出:
#直接查找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"]')
輸出: