標籤:rdd name stp UI smo gdi poj tla uem
前言
很多時候我們無法直接定位到某個元素,我們可以先定位它的父元素,通過父元素來找子項目就比較容易
一、子節點
1.以部落格園首頁的摘要為例:<div class="c_b_p_desc">這個tag為起點
2.那麼div這個tag就是父節點
3."摘要: 前言 本篇詳細。。。"這個string就是上面div的子節點(string通常看成是一個tag的子節點)
4."<a class="c_b_p_desc_readmore" href="http://www.cnblogs.com/yoyoketang/p/6906558.html">閱讀全文</a>"這個也是div的子節點
二、.contents
1.tag對象contents可以擷取所有的子節點,返回的是list
2.len()函數統計子節點的個數
3.通過下標可以取出對應的子節點
1 # coding:utf-8 2 from bs4 import BeautifulSoup 3 import requests 4 5 r = requests.get("http://www.cnblogs.com/yoyoketang/") 6 # 請求首頁後擷取整個html介面 7 blog = r.content 8 # 用html.parser解析html 9 soup = BeautifulSoup(blog, "html.parser")
10 # find方法尋找頁面上第一個屬性匹配的tag對象11 tag_soup = soup.find(class_="c_b_p_desc")
12 # len函數擷取子節點的個數13 print len(tag_soup.contents)
14 # 迴圈列印出子節點15 for i in tag_soup.contents:16 print i17 18 # 通過下標取出第1個string子節點19 print tag_soup.contents[0]20 # 通過下標取出第2個a子節點21 print tag_soup.contents[1]
三、.children
1.點children這個產生的是list對象,跟上面的點contents功能一樣
2.只是這裡是list對象,就只能for迴圈讀出了,不能通過下標擷取
(一般上面那個contents用的比較多,可能children效能更快吧,我猜想的嘿嘿!)
四、.descendants
1.上面的contents只能擷取該元素的直接子節點,如果這個元素的子節點又有子節點(也就是孫節點了),這時候擷取所有的子孫節點就可以用.descendants方法
2.擷取div的子節點有兩個,子孫節點有三個,因為a標籤下還有個“閱讀全文”這個string子節點
1 # coding:utf-8 2 from bs4 import BeautifulSoup 3 import requests 4 5 r = requests.get("http://www.cnblogs.com/yoyoketang/") 6 # 請求首頁後擷取整個html介面 7 blog = r.content 8 # 用html.parser解析html 9 soup = BeautifulSoup(blog, "html.parser")10 # find方法尋找頁面上第一個屬性匹配的tag對象11 tag_soup = soup.find(class_="c_b_p_desc")12 13 # len函數擷取子節點的個數14 print len(list(tag_soup.children))15 16 # 擷取子孫節點的個數17 print len(list(tag_soup.descendants))18 19 for i in tag_soup.descendants:20 print i
五、爬取部落格首頁的標籤內容
1.部落格左側的標籤並不是這個連結:http://www.cnblogs.com/yoyoketang/
2.通過抓包可以看到,這個url地址是:http://www.cnblogs.com/yoyoketang/mvc/blog/sidecolumn.aspx?blogApp=yoyoketang
2.可以先定位父元素:<div class="catListTag">
六、參考代碼:
1 # coding:utf-8 2 from bs4 import BeautifulSoup 3 import requests 4 5 r = requests.get("http://www.cnblogs.com/yoyoketang/mvc/blog/sidecolumn.aspx?blogApp=yoyoketang") 6 # 請求首頁後擷取整個html介面 7 blog = r.content 8 # 用html.parser解析html 9 soup = BeautifulSoup(blog, "html.parser")10 tag_soup = soup.find(class_="catListTag")11 12 # print body.prettify()13 14 ul_soup = tag_soup.find_all("a")15 print ul_soup16 for i in ul_soup:17 print i.string
對python介面自動化有興趣的,可以加python介面自動化QQ群:226296743
也可以關注下我的個人公眾號:
python爬蟲beautifulsoup4系列4-子節點