iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 17
1
AI & Data

30天 python 學習心得分享系列 第 17

Day17-爬蟲使用模組介紹-Beautiful Soup 2

  • 分享至 

  • xImage
  •  

讓我們再繼續學習這碗美麗的湯使用方法吧~~

HTML 屬性搜尋

  • 透過HTML屬性取值find
    依照上篇文章的HTML範例要取得id=i1的tag
i1_tag = soup.find(id='i1')
print(i1_tag)

#輸出:<p class="contents" id="i1">456</p>

透過Tag與屬性更精準取值:

a_tag = soup.find('a', href = 'http://www.baidu.com')
print(a_tag)

#輸出:<a href="http://www.baidu.com">advertisements</a>

也有提供多引入正規表示法模組,不太了解正規表示法可參考這篇文章

import re
#取出開頭為http的連結
links = soup.find_all(href=re.compile("^http"))
print(links)

#輸出:[<a href="http://www.baidu.com">advertisements</a>]

在取用Html5一些新屬性時需要用特別的寫法如data-*屬性:

html = '<div data-num="123">foo!</div>'
soup = BeautifulSoup(html, 'html.parser')
data_tag = soup.find(attrs={"data-num": "123"})
print(data_tag)

#輸出:<div data-num="123">foo!</div>

透過CSS搜尋

由於class是python 程式語言的保留字,所以Beautiful Soup改以class_這個名稱代表 HTML 節點的class 屬性,一個 HTML標籤元素可以同時有多個CSS的class 屬性值,而我們在以class_比對時,只要其中一個 class 符合就算比對成功如下範例

p_tag = soup.find_all("p", class_='news')
print(p_tag)

#輸出:[<p class="news">123</p>]

也可以使用select()規則與CSS選擇器相同,id可用#代表,class可用.代表

a = soup.select('.news')
b = soup.select('#i1')
print(a)
print(b)

#輸出:[<p class="news">123</p>]
#輸出:[<p class="contents" id="i1">456</p>]

以節點為基準向上、向前與向後搜尋

link2_tag為起始點

from bs4 import BeautifulSoup

html_doc = """
<body>
<a id="link0" href="/my_link0">Link 0</a>
<p class="my_par">
<a id="link1" href="/my_link1">Link 1</a>
<a id="link2" href="/my_link2">Link 2</a>
<a id="link3" href="/my_link3">Link 3</a>
<a id="link4" href="/my_link4">Link 4</a>
</p>
</body>
"""

soup = BeautifulSoup(html_doc, 'html.parser')
link2_tag = soup.find(id="link2")
  • 向上
p_tag = link2_tag.find_parents("p")
print(p_tag)
#輸出:
[<p class="my_par">
<a href="/my_link1" id="link1">Link 1</a>
<a href="/my_link2" id="link2">Link 2</a>
<a href="/my_link3" id="link3">Link 3</a>
<a href="/my_link4" id="link4">Link 4</a>
</p>]
  • 向後

*僅尋找同層元素

link_tag = link2_tag.find_next_siblings("a")
print(link_tag)
#輸出:
[<a href="/my_link3" id="link3">Link 3</a>, <a href="/my_link4" id="link4">Link 4</a>]
  • 向前

*僅尋找同層元素

link_tag = link2_tag.find_previous_siblings("a")
print(link_tag)
#輸出:[<a href="/my_link1" id="link1">Link 1</a>]

取得屬性值

  • get()

使用get()函數取得節點屬性的值

html_doc = """
<body>
<a id="link0" href="/my_link0">Link 0</a>
<p class="my_par">
<a id="link1" href="/my_link1">Link 1</a>
<a id="link2" href="/my_link2">Link 2</a>
<a id="link3" href="/my_link3">Link 3</a>
<a id="link3" href="/my_link4">Link 4</a>
</p>
</body>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
a_tag = soup.select("#link3")
print(a_tag[0].get("href"))

#輸出: /my_link3
  • []

直接使用[]取得屬性值

a_tag = soup.select("#link3")
print(a_tag[0]["href"])

#輸出: /my_link3
  • attrs

會回傳此Tag可獲取的屬性,也可使用attrs[]指定屬性獲取

print(soup.a.attrs)

#輸出: {'id': 'link0', 'href': '/my_link0'}

參考資料:https://hk.saowen.com/a/dbceb20617d08a888522e32258ce4e8244b4829f9589e5c3f433575c3e07b8a7
參考資料:https://blog.gtwang.org/programming/python-beautiful-soup-module-scrape-web-pages-tutorial/
參考資料:https://ithelp.ithome.com.tw/articles/10196817

文章內容如果有錯誤歡迎留言告知,可以幫忙糾正錯誤的觀念,感謝!


上一篇
Day16-爬蟲使用模組介紹-Beautiful Soup 1
下一篇
Day18-爬蟲實戰1
系列文
30天 python 學習心得分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言