BeautifulSoup_第一節
阿新 • • 發佈:2017-11-30
應該 ont sharp html標簽 符號 註釋符 tor 方便 ref
源自http://cuiqingcai.com/1319.html
import bs4 from bs4 import BeautifulSoup html = """ <html><head><title>The Dormouse‘s story</title></head> <body> <p class="title" name="dromouse"><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) #soup = BeautifulSoup(open(‘index.html)) #print(soup.prettify()) ‘‘‘ #Tag 通俗點講就是 HTML 中的一個個標簽 #我們可以利用 soup加標簽名輕松地獲取這些標簽的內容,是不是感覺比正則表達式方便多了? # 不過有一點是,它查找的是在所有內容中的第一個符合要求的標簽 #print(soup.title) #Tag的name屬性 print(soup.name) print(soup.head.name) #Tag的attrs屬性 #獲取p標簽的所有屬性,返回字典 print(soup.p.attrs) #獲取單個屬性 print(soup.p[‘class‘]) print(soup.p.get(‘class‘)) ‘‘‘ ‘‘‘ #NavigableString 可以遍歷的字符串 #獲取標簽內部的文字 print(soup.p.string) #BeautifulSoup 對象表示的是一個文檔的全部內容. # 大部分時候,可以把它當作 Tag 對象,是一個特殊的 Tag # 我們可以分別獲取它的類型,名稱,以及屬性來感受一下 print(type(soup.name)) print(soup.name) print(soup.attrs) ‘‘‘ ‘‘‘ #Comment #Comment 對象是一個特殊類型的 NavigableString 對象, # 其實輸出的內容仍然不包括註釋符號,但是如果不好好處理它,可能會對我們的文本處理造成意想不到的麻煩。 print(soup.a) print(soup.a.string) print(type(soup.a.string)) #a 標簽裏的內容實際上是註釋,但是如果我們利用 .string 來輸出它的內容,我們發現它已經把註釋符號去掉了 #另外我們打印輸出下它的類型,發現它是一個 Comment 類型,所以,我們在使用前最好做一下判斷 if type(soup.a.string)==bs4.element.Comment: print(soup.a.string) ‘‘‘ #6. 遍歷文檔樹 #(1)直接子節點------ .contents .children屬性 #tag 的 .content 屬性可以將tag的子節點以-列表-的方式輸出 print(soup.head.contents) #.children它返回的不是一個 list,不過我們可以通過遍歷獲取所有子節點。 #我們打印輸出 .children 看一下,可以發現它是一個 list 生成器對象 print(soup.head.children) for child in soup.body.children: print(child) #(2)所有子孫節點 .descendants 屬性 #運行結果如下,可以發現,所有的節點都被打印出來了,先生最外層的 HTML標簽,其次從 head 標簽一個個剝離,以此類推。 #一層一層剝開它的標簽 for child in soup.descendants: print(child) #(3)節點內容 .string 屬性 #如果tag只有一個 NavigableString 類型子節點,那麽這個tag可以使用 .string 得到子節點。 # 如果一個tag僅有一個子節點,那麽這個tag也可以使用 .string 方法,輸出結果與當前唯一子節點的 .string 結果相同。 #也就是說 如果一個標簽裏面沒有標簽了,那麽 .string 就會返回標簽裏面的內容。如果標簽裏面只有唯一的一個標簽了,那麽 .string 也會返回最裏面的內容 print(soup.head.string) print(soup.title.string) #如果tag包含了多個子節點,tag就無法確定,string 方法應該調用哪個子節點的內容, .string 的輸出結果是 None print(soup.html.string) #(4)多個內容 .strigs .stripped_strings 屬性 #.strings 獲取多個內容,不過需要遍歷獲取 for strings in soup.strings: print(repr(strings)) # .stripped_strings 輸出的字符串中可能包含了很多空格或空行,使用 .stripped_strings 可以去除多余空白內容 for strings in soup.stripped_strings: print(repr(strings)) #(5)父節點 .parent 屬性 p = soup.p print(p.parent.name) content = soup.head.title.string print(content.parent.name) #(6)全部父節點 .parents content = soup.head.title.string for parent in content.parents: print(type(parent)) print(parent.name)
BeautifulSoup_第一節