bs4的使用 遍歷文件樹

朱饱饱發表於2024-04-07

bs4的使用

# 遍歷文件樹
# 搜尋文件樹(5種過濾規則)
# limit和recursive引數

import requests
# pip3 install beautifulsoup4  解析html和xml,修改html和xml
from bs4 import BeautifulSoup

# res=requests.get('https://www.autohome.com.cn/news/1/#liststart')
#
# with open('a.html','w') as f:
#     f.write(res.text)

from bs4 import BeautifulSoup
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p id="my_p" class="title">hello<b id="bbb" class="boldest">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>
"""
# 文件容錯能力,不是一個標準的html也能解析
soup=BeautifulSoup(html_doc,'lxml')

# print(soup.prettify())

遍歷文件樹
#遍歷文件樹:即直接透過標籤名字選擇,特點是選擇速度快,但如果存在多個相同的標籤則只返回第一個
#1、用法

# head=soup.head
# print(head)

#2、獲取標籤的名稱

# head=soup.head
# print(head.name)

#3、獲取標籤的屬性*****

# p=soup.body.p
# # class可能有多個,即便有一個也放到列表中
# # print(p.attrs)
# print(p.attrs.get('class'))
# print(p['class'])
# print(p.get('class'))

#4、獲取標籤的內容

# p=soup.body.p
# # text會取該標籤,子子孫孫的內容,拼到一起
# print(p.text)
# print(p.string)# # p下的文字只有一個時,取到,否則為None
# print(p.strings)#  生成器
# print(list(p.strings))  # #拿到一個生成器物件, 取到p下所有的文字內容,一個一個的在生成器中

5.巢狀選擇

# a=soup.body.a
# print(a.get('id'))

#6、子節點、子孫節點

# print(soup.p.contents) #p下所有子節點
# print(soup.p.children) #得到一個迭代器,包含p下所有子節點
# print(list(soup.p.children)) #得到一個迭代器,包含p下所有子節點

#7、父節點、祖先節點

# print(soup.a.parent) #獲取a標籤的父節點(只有一個)
# print(soup.p.parent) #獲取p標籤的父節點
# print(soup.a.parents) #找到a標籤所有的祖先節點,父親的父親,父親的父親的父親...
# print(list(soup.a.parents))#找到a標籤所有的祖先節點,父親的父親,父親的父親的父親...
# print(len(list(soup.a.parents)))#找到a標籤所有的祖先節點,父親的父親,父親的父親的父親...

#8、兄弟節點

# print(soup.a.next_sibling) #下一個兄弟
# print(soup.a.previous_sibling) #上一個兄弟
#
# print(list(soup.a.next_siblings)) #下面的兄弟們=>生成器物件
# print(list(soup.a.previous_siblings)) #上面的兄弟們=>生成器物件

# 重點:取標籤名,取屬性值,巢狀選擇

搜尋文件樹
# find() # 只返回找到的第一個
# find_all() # 找到的所有
# 五種過濾器: 字串、正規表示式、列表、True、方法

# 字串過濾,過濾內容是字串
# a=soup.find(name='a')
# res=soup.find(id='my_p')
# res=soup.find(class_='story')
# res=soup.find(href='http://example.com/elsie')

# res=soup.find(attrs={'id':'my_p'})
# res=soup.find(attrs={'class':'story'})
# print(res)

# 正規表示式
# import re
# # re_b=re.compile('^b')
# res=soup.find(name=re_b)
# # res=soup.find_all(name=re_b)
# res=soup.find_all(id=re.compile('^l'))
# print(res)

# 列表

# res=soup.find_all(name=['body','b'])
# res=soup.find_all(class_=['sister','title'])
# print(res)

# True和false

# res=soup.find_all(name=True)
# res=soup.find_all(id=True)
# res=soup.find_all(id=False)
# res=soup.find_all(href=True)
# print(res)

bs4的使用  遍歷文件樹
# 方法(瞭解)
# def has_class_but_no_id(tag):
# return tag.has_attr('class') and not tag.has_attr('id')
#
# print(soup.find_all(has_class_but_no_id))


#limit(限制查詢的條數)
# res=soup.find_all(name=True,limit=1)
# print(res)
# recursive(recursive遞迴查詢,找子子孫孫)
# res=soup.body.find_all(name='b ',recursive=False)
# res=soup.body.find_all(name='p',recursive=False)
# res=soup.body.find_all(name='b',recursive=True)
# print(res)

# css選擇
# ret=soup.select('#my_p')
# https://www.w3school.com.cn/cssref/css_selectors.asp
# ret=soup.select('body p') # 子子孫孫
# ret=soup.select('body>p') # 直接子節點(兒子)
# ret=soup.select('body>p')[0].text # 直接子節點(兒子)
# # ret=soup.select('body>p')[0].a.find()
# print(ret)

 

# bs4的修改文件樹 軟體配置檔案是xml格式的

# 軟體的配置檔案
# ini:configparser
# conf
# xml:bs4
# yaml格式
瞭解

相關文章