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=http://www.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)
- 查——遍歷 .
點取方式返回同名的第一個tagtag.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="http://x.cn"] 根據屬性找; a[href^="https"]) 根據屬性找,首匹配; a[href$=".html"]) 根據屬性找,尾匹配; a[href*=".com/el"] 根據屬性找,模糊匹配。
推薦閱讀:
※如何讓孩子在遊戲中成長?
※看完這篇文章,10倍提升你的學習效率
※為什麼知識越來越沒用
※藝術小白的藝術學習3部曲
※我起訴了豆瓣,因為我是一名逐夢演藝圈的好導演
TAG:學習 |