python 極好用的解析 html 標簽的模塊 - BeautifulSoup


  記錄下各種使用姿態

  測試的 html 代碼:

<html>
        <head>
            <title>Test</title>
        <body>
            <p class="title">
                <b>Test</b>
            </p>
            <div name="ele" class="story">
                "i'm a div"
                <ul>
                    <li>
                        <a href="http://www.baidu.com" id="link1">
                            <img src="http://www.baidu.com" data-src='//www.baidu.com'>
                        </a>
                    </li>
                    <li>
                        <a href="http://www.baidu.com" id="link2">
                            <img src="data:image/jpg;base64,covijfklawefonva...">
                        </a>
                    </li>
                </ul>
            </div>

  這里使用了 python 內置的解析器:

soup = BeautifulSoup(html, 'html.parser')

  開始輸出

# 輸出整個 html
print '\n', soup.prettify()

# title 標簽
print '\n', soup.title

# title 標簽名稱
print '\n', soup.title.name

# title 標簽內容
print '\n', soup.title.string

# title 標簽的父級標簽名稱
print '\n', soup.title.parent.name

# p 標簽(首個 p)
print '\n', soup.p

# p 標簽名稱
print '\n', soup.p.name

# p 標簽下的 b 標簽
print '\n', soup.p.b

# p 標簽的 class 屬性值,類型、數組首個值
print '\n', soup.p["class"], type(soup.p["class"]), soup.p["class"][0]

# 首個 a 標簽
print '\n', soup.a

# 查找所有 a 標簽, 類型數組
a_arr = soup.find_all('a')
for value in a_arr:
    print value

# 查找 id = link2 的標簽(特殊的標簽屬性可以不寫 attrs)
print '\n', soup.find(id='link2')

# 查找 class 是 title 的標簽
print '\n', soup.find(attrs={'class': 'title'})

# 查找 name 是 ele 的標簽
print '\n', soup.find(attrs={'name': 'ele'})

# 查找 img,獲取相應屬性值
img_arr = soup.find_all('img')
for value in img_arr:
    print '\n   ', value['src']
    attrs = value.attrs
    for attr in attrs:
        print '\n ', attr
        if attr == 'data-src':
            print '\n   ', value[attr]

# 獲取 div 標簽下所有子節點
print '\n', soup.div.contents,

# 獲取 div 下第二個子節點
print '\n', soup.div.contents[1]

# 獲取 div 下第二個子節點
print '\n', soup.div.contents[1].li

# 獲取 b 標簽的文本內容
print '\n', soup.b.get_text()

# 獲取無值屬性再判斷是否None
print '\n', soup.div.title, type(soup.div.title), soup.div.title == None, not soup.div.title

# css 選擇器 select()
print '\n', soup.select('b')

 

   最后,貼上測試代碼

# -*- coding: utf-8 -*-


from bs4 import BeautifulSoup


def main():
    html = '''
    <html>
        <head>
            <title>Test</title>
        <body>
            <p class="title">
                <b>Test</b>
            </p>
            <div name="ele" class="story">
                "i'm a div"
                <ul>
                    <li>
                        <a href="http://www.baidu.com" id="link1">
                            <img src="http://www.baidu.com" data-src='//www.baidu.com'>
                        </a>
                    </li>
                    <li>
                        <a href="http://www.baidu.com" id="link2">
                            <img src="data:image/jpg;base64,covijfklawefonva...">
                        </a>
                    </li>
                </ul>
            </div>
    '''

    soup = BeautifulSoup(html, 'html.parser')
    # 輸出整個 html
    # print '\n', soup.prettify()
    # title 標簽
    # print '\n', soup.title
    # title 標簽名稱
    # print '\n', soup.title.name
    # title 標簽內容
    # print '\n', soup.title.string
    # title 標簽的父級標簽名稱
    # print '\n', soup.title.parent.name
    # p 標簽(首個 p)
    # print '\n', soup.p
    # p 標簽名稱
    # print '\n', soup.p.name
    # p 標簽下的 b 標簽
    # print '\n', soup.p.b
    # p 標簽的 class 屬性值,類型、數組首個值
    # print '\n', soup.p["class"], type(soup.p["class"]), soup.p["class"][0]
    # 首個 a 標簽
    # print '\n', soup.a
    # 查找所有 a 標簽, 類型數組
    # a_arr = soup.find_all('a')
    # for value in a_arr:
    #     print '\n', value
    # 查找 id = link2 的標簽(特殊的標簽屬性可以不寫 attrs)
    # print '\n', soup.find(id='link2')
    # 查找 class 是 title 的標簽
    # print '\n', soup.find(attrs={'class': 'title'})
    # 查找 name 是 ele 的標簽
    # print '\n', soup.find(attrs={'name': 'ele'})
    # 查找 img,獲取相應屬性值
    # img_arr = soup.find_all('img')
    # for value in img_arr:
    #     print '\n   ', value['src']
    #     attrs = value.attrs
    #     for attr in attrs:
    #         print '\n ', attr
    #         if attr == 'data-src':
    #             print '\n   ', value[attr]
    # 獲取 div 標簽下所有子節點
    # print '\n', soup.div.contents,
    # 獲取 div 下首個子節點
    # print '\n', soup.div.contents[0]
    # 獲取 div 下第二個子節點
    # print '\n', soup.div.contents[1]
    # 獲取 div 下第二個子節點
    # print '\n', soup.div.contents[1].li
    # 獲取 b 標簽的文本內容
    # print '\n', soup.b.get_text()
    # 獲取無值屬性
    # print '\n', soup.div.title, type(soup.div.title), soup.div.title == None, not soup.div.title
    # not 取反
    # if not None:
    #     print None
    # css 選擇器 select()
    print '\n', soup.select('b')


# file onload
if __name__ == '__main__':
    main()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM