1. 程式人生 > >[學習筆記]Beautiful Soup語法基本使用

[學習筆記]Beautiful Soup語法基本使用

1. Beautiful_Soup語法

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