1. 程式人生 > >BeautifulSoup_第一節

BeautifulSoup_第一節

應該 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_第一節