標籤:

Beautiful Soup 手記

從「概念+方法」下手,全面讀一遍第一手資料,將例子執行一遍,覺得精妙的地方再按需去讀源碼。

BS官方中文 BeautifulSoup 4.2.0 文檔

BS核心概念是Tag,html的tag,方法有增刪改查。(BeautifulSoup、NavigableString在概念上是特殊的Tag,擁有tag的絕大部分特點)

soup = BeautifulSoup(html_text, from_encoding="gbk") #得到一個BeautifulSoup實例,後續操作都基於此展開。

  • Tag

每個tag都有name、屬性attrs,有父子兄弟鏈。

tag=soup.html.body.table.... #點選定位。

tag.name #html標籤名。

tag.attrs, tag[style] #attrs是個字典 。

tag.string 是NavigableString,可以通過unicode()轉換。

newtag=soup.new_tag(a,href=baidu.com/) #造個tag

tag.append(soup.new_string(new text)) # tag.append(new text)

tag.append(newtag)

tag.insert(1,new text) #insert可以指定位置,而非追加到最後。

tag.insert_before(newtag) #把newtag插入到tag.contents的最前

tag.insert_after(newtag) #把newtag插入到tag.contents的最後

tag.clear() #清空tag的內容,tag自身的屬性會保留

x=tag.subtag1.extract() #把subtag1移除,賦給x

tag.subtag1.decompose() #把subtag1銷毀,返回None

tag.subtag1.replace_with(newtag)

  • 查——遍歷 .

點取方式返回同名的第一個tag

tag.contents 直接子節點list

tag.childern 直接子節點迭代

tag.descendants 子孫節點遞歸

tag.string只有一個子節點的tag可以用string屬性得到文本;多子節點無法確定就返回None

tag.strings 所有文本迭代

tag.stripped_strings 濾掉空行,去除首尾空白

tag.parent 定位到父節點

tag.parents父節點遞歸到html頂層

tag.next_sibling 下一個兄弟節點,絕大多數是換行符

tag.previous_sibling 上一個兄弟節點,絕大多數是換行符

tag.next_siblings 之前所有兄弟節點

tag.previous_siblings 之後所有兄弟節點

  • 查——搜索

    tag.find_all(name,text,recursive,class_,**kwargs)

4種過濾器:字元串a;列表[a,p];正則re.compile("^b");自定義單參函數、對輸入tag判True則濾出。

name=過濾器,搜tag名 # name=[a,td]

text=過濾器,搜文本內容

recursive=False,只搜直接子節點

class_=過濾器,搜css類 # 4.1之前的版本attrs={class:過濾器}

其他args,id=;href= ……

同類函數見名知意: find(), find_parents(), find_parent(), find_next_siblings(),find_next_sibling(), find_previous_siblings(), find_previous_sibling(), find_all_next(),find_next(), find_all_previous(), find_previous()

  • 查——選擇器 tag.select(選擇器)

幾種選擇器:table tr 找tag; .sist 類名; #sistid id; head > title直接子標籤; #link1 ~ .sist) link1的所有兄弟; #link1 + .sist) link1的首個兄弟; a[href="x.cn"] 根據屬性找; a[href^="https"]) 根據屬性找,首匹配; a[href$=".html"]) 根據屬性找,尾匹配; a[href*=".com/el"] 根據屬性找,模糊匹配。


推薦閱讀:

如何讓孩子在遊戲中成長?
看完這篇文章,10倍提升你的學習效率
為什麼知識越來越沒用
藝術小白的藝術學習3部曲
我起訴了豆瓣,因為我是一名逐夢演藝圈的好導演

TAG:學習 |