[學習筆記]Beautiful Soup語法基本使用
阿新 • • 發佈:2019-02-04
1. Beautiful_Soup語法
find all搜尋的是全部節點,find搜尋的是滿足條件的第一個節點
2.獲取網頁資訊
思路如下
# <a href = "123.html" class = 'article_link'> Python </a>
# 根據 HTML 網頁字串建立 BeautifulSoup 物件
soup = BeautifulSoup(
html_doc, # HTML 文件字串
'html.parser', # HTML 解析器
from_encoding='utf8') # HTML 文件的編碼
# 查詢所有標籤為 a 的節點
soup.find_all('a')
# 查詢所有標籤為 a,連結符合 /view/123.html 形式的節點
soup.find_all('a', href='/view/123.htm')
soup.find_all('a', href=re.compile(r'/view/\d+\.htm'))
# 查詢所有標籤為div,class,為 abc, 文字為 Python 的節點
soup.find_all('div', class_='abc', string='Python')
# 得到節點 <a href = '1.html'>Python</a>
# 獲取查詢到的節點的標籤名稱
node.name
# 獲取查詢到的節點的href 屬性
node['href']
# 獲取查詢到的節點的連結文字
node.get_text()
3.編碼
3.1 材料準備
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><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>
"""
3.2 解析材料資料
執行示例
soup = BeautifulSoup(html_doc, "html.parser", from_encoding='utf8')
print("獲取所有的連結")
links = soup.find_all('a')
for link in links:
print(link.name, link['href'], link.get_text())
執行結果
獲取所有的連結
a http://example.com/elsie Elsie
a http://example.com/lacie Lacie
a http://example.com/tillie Tillie
獲取單一連結資料
print("獲取 http://example.com/lacie 的連結")
link_node = soup.find('a', href="http://example.com/lacie")
print(link_node.name, link_node['href'], link_node.get_text())
執行示例
獲取 http://example.com/lacie 的連結
a http://example.com/lacie Lacie
使用正則表示式
print("正則表示式")
link_node = soup.find('a', href=re.compile(r'sie'))
print(link_node.name, link_node['href'], link_node.get_text())
執行結果
正則表示式
a http://example.com/elsie Elsie
根據 p 段落 class 的內容
print("根據 p 段落 class 的內容")
# class_ 需要加下劃線
p_node = soup.find('p', class_="title")
print(p_node.name, p_node.get_text())
根據 p 段落 class 的內容
p The Dormouse's story
3.3 完整執行示例
# coding:utf8
from bs4 import BeautifulSoup
import re
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><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_doc, "html.parser", from_encoding='utf8')
print("獲取所有的連結")
links = soup.find_all('a')
for link in links:
print(link.name, link['href'], link.get_text())
print("獲取 http://example.com/lacie 的連結")
link_node = soup.find('a', href="http://example.com/lacie")
print(link_node.name, link_node['href'], link_node.get_text())
print("正則表示式")
link_node = soup.find('a', href=re.compile(r'sie'))
print(link_node.name, link_node['href'], link_node.get_text())
print("根據 p 段落 class 的內容")
# class_ 需要加下劃線
p_node = soup.find('p', class_="title")
print(p_node.name, p_node.get_text())
執行結果
a http://example.com/lacie Lacie
a http://example.com/tillie Tillie
獲取 http://example.com/lacie 的連結
a http://example.com/lacie Lacie
正則表示式
a http://example.com/elsie Elsie
根據 p 段落 class 的內容
p The Dormouse's story