Python知識分享網(wǎng) - 專業(yè)的Python學(xué)習(xí)網(wǎng)站 學(xué)Python,上Python222
Python beautifulsoup解析本地文件之基礎(chǔ)語法
匿名網(wǎng)友發(fā)布于:2023-10-29 20:48:58
(侵權(quán)舉報(bào))

2024 一天掌握python爬蟲【基礎(chǔ)篇】 涵蓋 requests、beautifulsoup、selenium

https://www.bilibili.com/video/BV1Ju4y1Y7k6/

 

beautifulsoup支持解析本地文件和網(wǎng)絡(luò)文件,需要注意的是在實(shí)例化 BeautifulSoup 對象時(shí),“html.parser” 是一個(gè)解析器,用于解析 HTML 代碼,可以使用其他解析器,如 lxml、html5lib 等

通過 bs4 對象,可以使用多種方式來獲取 HTML 中的元素信息,包括標(biāo)簽名、屬性、文本等。

首先準(zhǔn)備一個(gè)測試文件test.html

 

<html>
<head>
    <meta charset="utf-8">
    <title>python222-這是一個(gè)示例文檔</title>
</head>
<body>
<p id="p1" class="content">這是一個(gè)段落。</p>
<div>
    <ul class="list">
        <li class="item">列表項(xiàng)1</li>
        <li class="item" id="l2">列表項(xiàng)2</li>
        <li class="item" id="l3">列表項(xiàng)3</li>
        <a  class="c1">java1234</a>
    </ul>
</div>
<a href="http://magnapowered.com" target="_blank" class="c2">python222</a>
<div id="d1">
    <span>
        測試內(nèi)容
    </span>
</div>
</body>
</html>

 

bs4常用方法有find(),find_all(),select()

.find_all() 查找所有符合條件的元素
.find() 查找第一個(gè)符合條件的元素
.select() 使用 CSS 選擇器查找元素
.children 獲取當(dāng)前標(biāo)簽的直接子元素
.descendants 獲取當(dāng)前標(biāo)簽的所有子孫節(jié)點(diǎn)
.parent 獲取當(dāng)前標(biāo)簽的父節(jié)點(diǎn)
.parents 獲取當(dāng)前標(biāo)簽的所有祖先節(jié)點(diǎn)
.next_sibling 獲取下一個(gè)同級標(biāo)簽
.previous_sibling 獲取上一個(gè)同級標(biāo)簽
.next_siblings 獲取后續(xù)所有同級標(biāo)簽
.previous_siblings 獲取前序所有同級標(biāo)簽
.has_attr() 判斷元素是否含有某個(gè)屬性

 

bs4支持DOM標(biāo)簽選擇器,屬性選擇前,層級選擇器等,以及獲取元素屬性和節(jié)點(diǎn)內(nèi)容

測試代碼:

from bs4 import BeautifulSoup

# 默認(rèn)打開的文件編碼是gbk,我們需要設(shè)置編碼
soup = BeautifulSoup(open('test.html', encoding='utf-8'), 'lxml')

# 根據(jù)標(biāo)簽名查找DOM節(jié)點(diǎn) 找到是第一個(gè)符合條件的DOM節(jié)點(diǎn)
# DOM DOM值  DOM標(biāo)簽名
print(type(soup.a), soup.a, soup.a.name)
# 獲取標(biāo)題的屬性和屬性值
print(type(soup.a.attrs), soup.a.attrs['href'])

# 獲取標(biāo)簽內(nèi)容
print(soup.p.string)

# bs4的一些常用方法
# 查找第一個(gè)符合條件的元素,支持屬性條件
print(soup.find('a'))
print(soup.find('a', target="_blank"))
# class屬性特殊點(diǎn) 關(guān)鍵字,所以加個(gè)下劃線
print(soup.find('a', class_="c2"))

# find_all 返回一個(gè)列表
print(soup.find_all('a'))
print(soup.find_all(['a', 'p']))  # 獲取多個(gè)DOM
print(soup.find_all('li', limit=2))

# select方法,使用 選擇器查找元素 返回一個(gè)列表
print(soup.select('a'))  # 根據(jù)標(biāo)簽選擇器
print(soup.select('.c2'))  # 根據(jù)類選擇器
print(soup.select('#l2'))  # 根據(jù)id選擇器

# 屬性選擇器
print(soup.select('li[id]'))  # 查找li標(biāo)簽中有id的DOM
print(soup.select('li[id="l3"]'))  # 查找li標(biāo)簽中id=l3的DOM

# 層級選擇器
print(soup.select('div li'))  # 后代選擇器 包括兒子和孫子等后代 多個(gè)標(biāo)簽名之間用空格
print(soup.select('div > ul > li'))  # 子代選擇器 僅限兒子這代 多個(gè)標(biāo)簽名之間用 >
print(soup.select('li,p'))

# 獲取節(jié)點(diǎn)信息
obj = soup.select('#d1')[0]
# 如果標(biāo)簽對象中,只有內(nèi)容,那么string,get_text()都可以使用
# 如果標(biāo)簽對象中,除了內(nèi)容還有標(biāo)簽,那么string就獲取不到數(shù)據(jù) 而get_text()是可以獲取數(shù)據(jù)
print(obj.string)
print(obj.get_text().strip())

# 節(jié)點(diǎn)屬性獲取
obj = soup.select('#p1')[0]
print(obj.name)  # 獲取標(biāo)簽名
print(obj.attrs)  # 返回屬性 字典類型
print(obj.attrs['id'])  # 獲取屬性值
print(obj['id'])  # 簡寫
print(obj.attrs.get("class")[0])  # 獲取屬性值
print(obj.get("class")[0])  # 簡寫

 

轉(zhuǎn)載自: