BeautifulSoup

BeautifulSoup是一個python的lib,我用的版本是bs4.1。

他可以把html, xhtml, xml等等的網頁結構拆開,讓使用者可以抓取想要的標籤資訊。

安裝

$pip install beautifulsoup4

使用介紹

將BeautifulSoup引入後便可以使用

用BeautifulSoup把要取得的網頁資訊html_doc放進去並存入soup這個變數

這個html_doc可以寫在裡面,也可以使用寫好的html檔案

 from bs4 import BeautifulSoup

 html_doc = '''
 <html>
     <head>
         <title>這是測試網頁喔</title>
     </head>
     <body>
         <h1>我是h1標籤裡的字</h1>
         <a href="http://google.com.tw" id="google">咕狗大神</a>
         <a href="http://yahoo.com.tw" id="Yahoo">奇摩</a>
     </body>
 </html>
 '''
 soup = BeautifulSoup(html_doc)
 soup = BeautifulSoup(open("index.html"))

取得資訊如下, prettify() 可以幫你編排的漂亮些

print(soup.prettify())
# <html>
#     <head>
#         <title>這是測試網頁喔</title>
#     </head>
#     <body>
#         <h1>我是h1標籤裡的字</h1>
#         <a href="http://google.com.tw" id="google">咕狗大神</a>
#         <a href="http://yahoo.com.tw" id="Yahoo">奇摩</a>
#     </body>
# </html>

並且可以取得標籤樹的資料,如下

soup.title
# <title>這是測試網頁喔</title>

soup.title.name
# u'title'

soup.title.string
# u'這是測試網頁喔'

soup.title.parent.name
# u'head'

soup.a
# <a href="http://google.com.tw" id="google">咕狗大神</a>

soup.a['id']
# u'google'

soup.find_all('a')
# [<a href="http://google.com.tw" id="google">咕狗大神</a>,
#  <a href="http://yahoo.com.tw" id="Yahoo">奇摩</a>]

soup.find(id="Yahoo")
# <a href="http://yahoo.com.tw" id="Yahoo">奇摩</a>

基本用法

我使用過得一些bs4介紹

Name

置換標籤名稱

tag = soup.body.a
tag.name = "button"
print tag
# <button href="http://google.com.tw" id="google">咕狗大神</button>

attrs

新增屬性,檢查屬性, 刪除屬性

tag['class'] = 'test'
tag['id'] = '123'
print tag
# <button class='test' href="http://google.com.tw" id="123">咕狗大神</button>

print tag.attrs
# {u'class': u'test', u'href': u'http://google.com.tw', u'id': u'123'}

del tag['class']
del tag['id']
del tag['href']
print tag
# <button>咕狗大神</button>

find

搜尋有兩個方式, find() , find_all()

find(‘a’) 找第一個看到的a標籤

find_all(‘a’) 找所有的a標籤,並存成list

soup.find('a')
# <a href="http://google.com.tw" id="google">咕狗大神</a>

soup.find_all('a')
# [<a href="http://google.com.tw" id="google">咕狗大神</a>,
#  <a href="http://yahoo.com.tw" id="Yahoo">奇摩</a>]

進階搜尋

print soup.find_all(["a", "h1"])
# [<h1>我是h1標籤裡的字</h1>,
#  <a href="http://google.com.tw" id="google">咕狗大神</a>,
#  <a href="http://yahoo.com.tw" id="Yahoo">奇摩</a>]

for tag in soup.find_all(True):
print(tag.name)
# html
# head
# title
# body
# h1
# a
# a

參考網站

BeautifulSoup