#BeautfiulSoup是Python支持的一個第三方庫,它的主要做用是能夠很是方便的從HTML網頁中提取所須要的數據 #lxml是第三方的解析庫,默認狀況下BS4會使用Python自帶的解析器取解析html頁面,可是lxml解析速度更快,功能上更爲強大,由於它的底層是經過c語言實現的。 from bs4 import BeautifulSoup import re #建立一個BeautifulSoup對象 bs=BeautifulSoup(open("index.html",encoding="utf-8"),"lxml") #BeautifulSoup()類,它是將一個HTML文檔,轉換成一個複雜的,有層次的樹形結構,從而造成父節點和子節點之間的關係,每個節點對應一個Python對象。 #樹形結構中的Python對象類型: #BeautifulSoup:通常指代的是整個html文檔內容 #Tag:指代的就是html文檔中的一個標籤,有兩個重要的樹形,name,attrs #NavigableString:指代的是就是標籤中的文字 #Comment:這個對象是一個特殊的NavigableString對象,其輸出的內容是註釋可是不包含註釋符號 # print(bs) # print(type(bs))#BeautifulSoup #------------------------------選擇元素----------------------------------- # #獲取html文檔中title標籤的內容 # print(bs.title) # print(type(bs.title))#Tag # # #獲取html文檔中a標籤的內容(會匹配第一個符合要求的a標籤) # print(bs.a) # print(type(bs.a))#Tag # #獲取html文檔中的div標籤的內容 # print(bs.div) # print(type(bs.div))#Tag # #獲取html文檔中div下面的a標籤的內容 # print(bs.div.a) #-------------------提取信息(標籤名稱,屬性值,文本)----------------------------- #獲取標籤的名稱,name屬性是在獲取當前標籤的名稱 # print(bs.head.name) # print(bs.title.name) # #獲取某一個標籤內部的屬性值attrs # print(bs.a.attrs) # #只獲取某個標籤的其中一個屬性值 # print(bs.a["href"]) # print(bs.a.get("id")) # #獲取標籤的文本內容,string:獲取某個標籤的文本內容的時候,若是這個標籤裏面沒有標籤了,則.stirng獲取的就是該標籤的文本內容,若是該標籤內容中還抱歉其餘標籤則返回None # print(bs.title.string) # print(type(bs.title.string))#NavigableString # print(bs.div.string) # print(bs.p.string) # print(type(bs.p.string))#Comment #------------------------文檔樹節點的選擇-------------------------------------------------- #1>contents屬性:遍歷某一個父節點的直接子節點,能夠將Tag類型的直接子節點以列表的方式進行輸出,可是直接子節點內部的子節點是沒法單獨獲取的。 # print(bs.body.contents) # #直接從子節點列表中獲取某一個節點 # print(bs.body.contents[1]) # #2.>children屬性,返回的是一個生成器對象,能夠將Tag類型的直接子節點以生成器的方式進行輸出,可是直接子節點的內部的子節點沒法單獨獲取到。 # print(bs.body.children) # for i,child in enumerate(bs.body.children): # print(i,child) #3.>descendants屬性:獲取全部的子孫節點(即包含直接子節點,又包含子節點的子節點),結果也是一個生成器對象 # print(bs.body.descendants) # for i,child in enumerate(bs.body.descendants): # print(i,child) #4.>parent屬性:獲取父節點以及父節點包含的全部內容 # print(bs.title.parent) #5.>next_sibling屬性:獲取當前節點的下一個兄弟節點,若是沒有下一個兄弟節點,則返回None #實際文檔中的tag的.next_sibiling和.previous_sibling屬性一般是字符串或者空白,由於空白或者換行也能夠被視做爲一個節點,因此獲得的結果多是空白或者換行 # print("===",bs.meta.next_sibling) # print("===",bs.meta.next_sibling.next_sibling) # # #6.>previous_sibling屬性,獲取當前節點的上一個兄弟節點,若是沒有則返回None # print("----",bs.title.previous_sibling) # print("----",bs.title.previous_sibling.previous_sibling) #-----------------經過find_all 和find進行文檔樹內容的搜索------------------------------------ #1>find_all()用於搜索當前節點的全部子節點,返回值是一個列表 #name,attrs recursive, text,limit result_list=bs.find_all('a') print(result_list) result_list_1=bs.find_all(attrs={"class":"second"}) print(result_list_1) result_list_3=bs.find_all(attrs={"id":"one"}) print(result_list_3) #使用find_all()方法時,BeautifulSoup會檢索當前標籤的全部子孫節點,若是隻想搜索標籤的直接子節點,能夠將recursive設置爲False,limit能夠對查找到的節點個數進行限制 result_list_4=bs.body.find_all(recursive=False,limit=2) print(result_list_4) result_list_5=bs.find_all(text="騰訊") print(result_list_5) result_list_6=bs.find_all(id="one") print(result_list_6) #因爲class是Python的系統關鍵字,表示類。因此使用find_all來經過class屬性值來匹配內容的時候,須要將class變爲class_ result_list_7=bs.find_all(class_="second") print(result_list_7) result_list_8=bs.find_all(id=re.compile("two")) print(result_list_8) #find()和findall用法一致,只不過finall返回的是一個列表,find返回的是第一個符合條件的內容。 ''' (3)find_parents() find_parent() find_all() 和 find() 只搜索當前節點的全部子節點,孫子節點等. find_parents() 和 find_parent() 用來搜索當前節點的父輩節點,搜索方法與普通tag的搜索方法相同,搜索文檔搜索文檔包含的內容 (4)find_next_siblings() find_next_sibling() 這2個方法經過 .next_siblings 屬性對當 tag 的全部後面解析的兄弟 tag 節點進行迭代, find_next_siblings() 方法返回全部符合條件的後面的兄弟節點,find_next_sibling() 只返回符合條件的後面的第一個tag節點 (5)find_previous_siblings() find_previous_sibling() 這2個方法經過 .previous_siblings 屬性對當前 tag 的前面解析的兄弟 tag 節點進行迭代, find_previous_siblings() 方法返回全部符合條件的前面的兄弟節點, find_previous_sibling() 方法返回第一個符合條件的前面的兄弟節點 (6)find_all_next() find_next() 這2個方法經過 .next_elements 屬性對當前 tag 的以後的 tag 和字符串進行迭代, find_all_next() 方法返回全部符合條件的節點, find_next() 方法返回第一個符合條件的節點 (7)find_all_previous() 和 find_previous() 這2個方法經過 .previous_elements 屬性對當前節點前面的 tag 和字符串進行迭代, find_all_previous() 方法返回全部符合條件的節點, find_previous()方法返回第一個符合條件的節點 ''' #-----------------經過css選擇器進行文檔樹內容的搜索------------------------------------ #1.經過標籤名來搜索一個標籤 print(bs.select("title")) print(bs.select("a")) #2.經過class屬性值搜索一個標籤 #.是用來匹配一個屬性值得固定用法 print(bs.select(".second")) #3.經過id這個屬性值來搜索一個標籤 # #號是匹配id值得固定用法 print(bs.select("#two")) #4.組合查找 print(bs.select("div #two")) print(bs.select("div .second"))