Python 第三方模塊之 beautifulsoup(bs4)- 解析 HTML

簡單來說,Beautiful Soup是python的一個庫,最主要的功能是從網頁抓取數據。官方解釋如下:官網文檔

Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。
它是一個工具箱,通過解析文檔為用戶提供需要抓取的數據,因為簡單,所以不需要多少代碼就可以寫出一個完整的應用程序。

安裝

pip3 install beautifulsoup4

解析器

Beautiful Soup支持Python標準庫中的HTML解析器,還支持一些第三方的解析器,如果我們不安裝它,則 Python 會使用 Python默認的解析器,lxml 解析器更加強大,速度更快,推薦安裝。

pip3 install lxml

另一個可供選擇的解析器是純Python實現的 html5lib , html5lib的解析方式與瀏覽器相同,可以選擇下列方法來安裝html5lib:

pip install html5lib

解析器對比

在這里插入圖片描述
BeautifulSoup是一個模塊,該模塊用于接收一個HTML或XML字符串,然后將其進行格式化,之后遍可以使用他提供的方法進行快速查找指定元素,從而使得在HTML或XML中查找指定元素變得簡單。

用法

# 簡單示例
from bs4 import BeautifulSouphtml_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
asdf<div class="title"><b>The Dormouse's story總共</b><h1>f</h1></div>
<div class="story">Once upon a time there were three little sisters; and their names were<a  class="sister0" id="link1">Els<span>f</span>ie</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.</div>
ad<br/>sf
<p class="story">...</p>
</body>
</html>
"""soup = BeautifulSoup(html_doc, features="lxml")
tag1 = soup.find(name='a')        # 找到第一個a標簽
tag2 = soup.find_all(name='a')    # 找到所有的a標簽
tag3 = soup.select('#link2')      # 找到id=link2的標簽

find(name, attrs, recursive, text, **kwargs)

# name參數,查找所有名字為name的tag,字符串對象被忽略。 
soup.find_all('title') # keyword參數,如果一個指定名字的參數不是搜索內置的參數名,搜索時會把該參數當作指定名字tag的屬性來搜索。 
soup.find_all(id='link2')# 如果多個指定名字的參數可以同時過濾tag的多個屬性: 
soup.find_all(href=re.compile('elsie'),id='link1') # 有些tag屬性在搜索不能使用,比如HTML5中的data*屬性,但是可以通過find_all()的attrs參數定義一個字典來搜索: 
data_soup.find_all(attrs={'data-foo':'value'})# recursive參數
如果指向搜索tag的直接子節點,可以使用參數recursive=False# limit參數
可以用來限制返回結果的數量# text 參數
通過 text 參數可以搜搜文檔中的字符串內容,與 name 參數的可選值一樣, text 參數接受 字符串 , 正則表達式 , 列表

使用示例:

  1. text,標簽內容
print(soup.text)
print(soup.get_text()) 
# 兩種方式都可以返回獲取的所有文本
  1. name,標簽名稱
tag = soup.find('a')
name = tag.name   # 獲取標簽名稱
print(name)
tag.name = 'span' # 設置標簽名稱
print(soup)
  1. attrs,標簽屬性
tag = soup.find('a')
attrs = tag.attrs         # 獲取標簽屬性
print(attrs)
tag.attrs = {'ik':123}    # 設置標簽屬性
tag.attrs['id'] = 'iiiii' # 設置標簽屬性
print(soup)
  1. children,所有子標簽
body = soup.find('body')
v = body.children
  1. descendants,所有子子孫孫標簽
body = soup.find('body')
v = body.descendants
  1. clear,將標簽的所有子標簽全部清空(保留標簽名)
tag = soup.find('body')
tag.clear()
print(soup)
  1. decompose,遞歸的刪除所有的標簽
body = soup.find('body')
body.decompose()
print(soup)
  1. extract,遞歸的刪除所有的標簽,并獲取刪除的標簽
body = soup.find('body')
v = body.extract()
print(soup)
  1. decode,轉換為字符串(含當前標簽);decode_contents(不含當前標簽)
body = soup.find('body')
v = body.decode()
v = body.decode_contents()
print(v)
  1. encode,轉換為字節(含當前標簽);encode_contents(不含當前標簽)
body = soup.find('body')
v = body.encode()
v = body.encode_contents()
print(v)
  1. find,獲取匹配的第一個標簽
tag = soup.find('a')
print(tag)
tag = soup.find(name='a', attrs={'class': 'sister'}, recursive=True, text='Lacie')
tag = soup.find(name='a', class_='sister', recursive=True, text='Lacie')
print(tag)
  1. find_all,獲取匹配的所有標簽
tags = soup.find_all('a')
print(tags)
tags = soup.find_all('a',limit=1)
print(tags)
tags = soup.find_all(name='a', attrs={'class': 'sister'}, recursive=True, text='Lacie')
# tags = soup.find(name='a', class_='sister', recursive=True, text='Lacie')
print(tags)# ####### 列表 #######
# v = soup.find_all(name=['a','div'])
# print(v)# v = soup.find_all(class_=['sister0', 'sister'])
# print(v)# v = soup.find_all(text=['Tillie'])
# print(v, type(v[0]))# v = soup.find_all(id=['link1','link2'])
# print(v)# v = soup.find_all(href=['link1','link2'])
# print(v)# ####### 正則 #######
import re
# rep = re.compile('p')
# rep = re.compile('^p')
# v = soup.find_all(name=rep)
# print(v)# rep = re.compile('sister.*')
# v = soup.find_all(class_=rep)
# print(v)# rep = re.compile('http://www.oldboy.com/static/.*')
# v = soup.find_all(href=rep)
# print(v)# ####### 方法篩選 #######
# def func(tag):
# return tag.has_attr('class') and tag.has_attr('id')
# v = soup.find_all(name=func)
# print(v)# ####### get,獲取標簽屬性
# tag = soup.find('a')
# v = tag.get('id')
# print(v)
  1. has_attr,檢查標簽是否具有該屬性
tag = soup.find('a')
v = tag.has_attr('id')
print(v)
  1. get_text,獲取標簽內部文本內容
tag = soup.find('a')
v = tag.get_text('id')
print(v)
  1. index,檢查標簽在某標簽中的索引位置
tag = soup.find('body')
v = tag.index(tag.find('div'))
print(v)tag = soup.find('body')
for i,v in enumerate(tag):print(i,v)
  1. is_empty_element,是否是空標簽(是否可以是空)或者自閉合標簽,

判斷是否是如下標簽:’br’ , ‘hr’, ‘input’, ‘img’, ‘meta’,’spacer’, ‘link’, ‘frame’, ‘base’

tag = soup.find('br')
v = tag.is_empty_element
print(v)
  1. 當前的關聯標簽
soup.next
soup.next_element
soup.next_elements
soup.next_sibling
soup.next_siblings
tag.previous
tag.previous_element
tag.previous_elements
tag.previous_sibling
tag.previous_siblings
tag.parent
tag.parents
  1. 查找某標簽的關聯標簽
# tag.find_next(...)
# tag.find_all_next(...)
# tag.find_next_sibling(...)
# tag.find_next_siblings(...)# tag.find_previous(...)
# tag.find_all_previous(...)
# tag.find_previous_sibling(...)
# tag.find_previous_siblings(...)# tag.find_parent(...)
# tag.find_parents(...)# 參數同find_all
  1. select,select_one, CSS選擇器
soup.select("title")
soup.select("p nth-of-type(3)")
soup.select("body a")
soup.select("html head title")
tag = soup.select("span,a")
soup.select("head > title")
soup.select("p > a")
soup.select("p > a:nth-of-type(2)")
soup.select("p > #link1")
soup.select("body > a")
soup.select("#link1 ~ .sister")
soup.select("#link1 + .sister")
soup.select(".sister")
soup.select("[class~=sister]")
soup.select("#link1")
soup.select("a#link2")
soup.select('a[href]')
soup.select('a[href="http://example.com/elsie"]')
soup.select('a[href^="http://example.com/"]')
soup.select('a[href$="tillie"]')
soup.select('a[href*=".com/el"]')from bs4.element import Tagdef default_candidate_generator(tag):for child in tag.descendants:if not isinstance(child, Tag):continueif not child.has_attr('href'):continueyield childtags = soup.find('body').select("a", _candidate_generator=default_candidate_generator)
print(type(tags), tags)from bs4.element import Tag
def default_candidate_generator(tag):for child in tag.descendants:if not isinstance(child, Tag):continueif not child.has_attr('href'):continueyield childtags = soup.find('body').select("a", _candidate_generator=default_candidate_generator, limit=1)
print(type(tags), tags)
  1. 標簽的內容
# tag = soup.find('span')
# print(tag.string)          # 獲取
# tag.string = 'new content' # 設置
# print(soup)# tag = soup.find('body')
# print(tag.string)
# tag.string = 'xxx'
# print(soup)# tag = soup.find('body')
# v = tag.stripped_strings  # 遞歸內部獲取所有標簽的文本
# print(v)
  1. append在當前標簽內部追加一個標簽
# tag = soup.find('body')
# tag.append(soup.find('a'))
# print(soup)
#
# from bs4.element import Tag
# obj = Tag(name='i',attrs={'id': 'it'})
# obj.string = '我是一個新來的'
# tag = soup.find('body')
# tag.append(obj)
# print(soup)
  1. insert在當前標簽內部指定位置插入一個標簽
# from bs4.element import Tag
# obj = Tag(name='i', attrs={'id': 'it'})
# obj.string = '我是一個新來的'
# tag = soup.find('body')
# tag.insert(2, obj)
# print(soup)
  1. insert_after,insert_before 在當前標簽后面或前面插入
# from bs4.element import Tag
# obj = Tag(name='i', attrs={'id': 'it'})
# obj.string = '我是一個新來的'
# tag = soup.find('body')
# # tag.insert_before(obj)
# tag.insert_after(obj)
# print(soup)
  1. replace_with 在當前標簽替換為指定標簽
# from bs4.element import Tag
# obj = Tag(name='i', attrs={'id': 'it'})
# obj.string = '我是一個新來的'
# tag = soup.find('div')
# tag.replace_with(obj)
# print(soup)
  1. 創建標簽之間的關系
# tag = soup.find('div')
# a = soup.find('a')
# tag.setup(previous_sibling=a)
# print(tag.previous_sibling)
  1. wrap,將指定標簽把當前標簽包裹起來
# from bs4.element import Tag
# obj1 = Tag(name='div', attrs={'id': 'it'})
# obj1.string = '我是一個新來的'
#
# tag = soup.find('a')
# v = tag.wrap(obj1)
# print(soup)# tag = soup.find('a')
# v = tag.wrap(soup.find('p'))
# print(soup)
  1. unwrap,去掉當前標簽,將保留其包裹的標簽
# tag = soup.find('a')
# v = tag.unwrap()
# print(soup)

更多參數官方:http://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453856.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453856.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453856.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

modal vue 關閉_Vue彈出框的優雅實踐

引言頁面引用彈出框組件是經常碰見的需求,如果強行將彈出框組件放入到頁面中,雖然功能上奏效但沒有實現組件與頁面間的解耦,非常不利于后期的維護和功能的擴展.下面舉個例子來說明一下這種做法的弊端.click"openModal()">點擊 :is_open"is_open" close…

Python 第三方模塊之 lxml - 解析 HTML 和 XML 文件

lxml是python的一個解析庫&#xff0c;支持HTML和XML的解析&#xff0c;支持XPath解析方式&#xff0c;而且解析效率非常高 XPath&#xff0c;全稱XML Path Language&#xff0c;即XML路徑語言&#xff0c;它是一門在XML文檔中查找信息的語言&#xff0c;它最初是用來搜尋XML文…

(轉)Linux下PS1、PS2、PS3、PS4使用詳解

Linux下PS1、PS2、PS3、PS4使用詳解 原文&#xff1a;http://www.linuxidc.com/Linux/2016-10/136597.htm 1、PS1——默認提示符 如下所示&#xff0c;可以通過修改Linux下的默認提示符&#xff0c;使其更加實用。在下面的例子中&#xff0c;默認的PS1的值是“\s-\v\$”,顯示出…

開放平臺大抉擇

開放平臺大抉擇之新浪SAE&#xff1a;為個人應用開發帶來福音 導讀&#xff1a;繼上期淘寶網副總裁王文彬從平臺功能特色、運營狀況等多方面分享了淘寶開放平臺的歷程和挑戰之后。國內另一家云平臺服務方的典型代表——Sina App Engine(簡稱SAE)&#xff0c;作為新浪研發中心于…

ip68級防水可以泡多久_iPhone8防水級別升級至IP68:能在1.5米深水中堅持30分鐘

1月15日&#xff0c;業界最新的泄密消息顯示&#xff0c;蘋果擬在今年推出的“iPhone 8”智能手機會是一款革命性的手機&#xff0c;功能和配置就不多說了。蘋果還將解決iPhone 7的一個重要缺陷&#xff0c;就是大大增強iPhone 8的防水性能&#xff0c;防水級別達IP68。《韓國先…

HTTP POST 發送數據的參數 application/x-www-form-urlencoded、multipart/form-data、text/plain

HTTP 簡介 HTTP/1.1 協議規定的 HTTP 請求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 這幾種。 其中 POST 一般用來向服務端提交數據&#xff0c;本文主要討論 POST 提交數據的幾種方式。 我們知道&#xff0c;HTTP 協議是以 ASCII 碼傳輸&#xff0c;建…

vue 二進制文件的下載(解決亂碼和解壓報錯)

問題描述&#xff1a;項目中使用的是vue框架進行開發&#xff0c;因為文件下載存在權限問題&#xff0c;所以并不能通過 a 鏈接的 href 屬性直接賦值 URL進行下載&#xff0c; &#xff08;如果你的文件沒有下載權限&#xff0c;可以直接通過href屬性賦值URL的方法進行文件下載…

Python 第三方模塊之 psutil - 獲取系統運行的進程和系統利用率信息

一、psutil模塊: 官方網址&#xff1a;http://pythonhosted.org/psutil/ 1.psutil是一個跨平臺庫(http://pythonhosted.org/psutil/)能夠輕松實現獲取系統運行的進程和系統利用率&#xff08;包括CPU、內存、磁盤、網絡等&#xff09;信息。它主要用來做系統監控&#xff0c;…

石頭機器人紅燈快閃_機器人集體“快閃”活動爆紅網絡 “我是AI”與您相約智能新時代...

原標題&#xff1a;機器人集體“快閃”活動爆紅網絡 “我是AI”與您相約智能新時代3月10日下午&#xff0c;天津科學技術館內&#xff0c;悠揚美妙的歌聲《我和我的祖國》突然響起&#xff0c;隨后50個身形矯健的阿爾法機器人伴隨著歌聲翩翩起舞&#xff0c;動作整齊、科技感十…

淺談云計算與數據中心計算

文/林仕鼎 云計算概念發端于Google和Amazon等超大規模的互聯網公司&#xff0c;隨著這些公司業務的成功&#xff0c;作為其支撐技術的云計算也得到了業界的高度認可和廣泛傳播。時至今日&#xff0c;云計算已被普遍認為是IT產業發展的新階段&#xff0c;從而被賦予了很多產業和…

無線網絡實體圖生成工具airgraph-ng

無線網絡實體圖生成工具airgraph-ngairgraph-ng是aircrack-ng套件提供的一個圖表生成工具。該工具可以根據airodump工具生成的CSV文件繪制PNG格式的圖。繪制的圖有兩種類型&#xff0c;分別為AP-客戶端關聯圖和通用探測圖。通過AP-客戶端關聯圖&#xff0c;可以更為直觀的了解無…

高等代數期末考試題庫及答案_數學類高等代數期末考試試題A卷(含答案)

數學類高等代數期末考試試題A卷(含答案)課程編號MTH17063 北京理工大學2010-2011學年第一學期2009級數學類高等代數期末考試試題A卷班級 學號 姓名 成績 一、(25分)設表示域上的所有階矩陣構成的上的線性空間。取定&#xff0c;對于任意的&#xff0c;定義。(1)證明為上的一個線…

cocos2d-lua3.7組件篇(三)-http通信demo

客戶端使用lua、服務端使用QT做為服務器。 步驟&#xff1a; 客戶端 -----------Post 用戶名和密碼 服務端接受Post請求&#xff0c;讀取數據&#xff0c;返回response一、客戶端代碼 loadingImg require"app.scenes.LoadingLayer"local LoginScene class(&qu…

數據挖掘:如何尋找相關項

導讀&#xff1a;隨著大數據時代浪潮的到來數據科學家這一新興職業也越來越受到人們的關注。本文作者Alexandru Nedelcu就將數學挖掘算法與大數據有機的結合起來&#xff0c;并無縫的應用在面臨大數據浪潮的網站之中。 數據科學家需要具備專業領域知識并研究相應的算法以分析對…

Python 第三方模塊之 selenium - 模擬操作 Chrome 瀏覽器

1、安裝selenium 1.1、Python 安裝 selenium 模塊 pip install selenium1.2、下載驅動 選擇和自己chrom版本相對應的驅動到本地&#xff0c;下載地址 http://npm.taobao.org/mirrors/chromedriver/2、Python 操作 from selenium import webdriver import time import json…

jupyter notebook代碼導出_Jupyter Notebook導出包含中文的pdf_親測有效

Jupyter Notebook是很好的數據科學創作環境&#xff0c;是非常方便的Python代碼編輯器。jupyter提供導出的格式有.py、.html、.md、.pdf等。目前用其導出包含中文的pdf會遇到很多坑&#xff0c;網上也有一些解決方案&#xff0c;大致分為兩種方式&#xff0c;一是安裝 pandoc并…

前端之使用 POST 提交數據并跳轉

GET 方式 window.location.href是我們常用來在js中實現頁面跳轉的方法&#xff0c;這是使用get方式發送請求&#xff0c;示例如下 window.location.href url;優點是簡單易用&#xff0c;缺點是如果有參數的話&#xff0c;參數會暴露在url地址中&#xff0c;這降低了系統的安…

cef js返回c++的代碼_CEF3開發者系列之外篇——IE中JS與C++交互

使用IE內核開發客戶端產品&#xff0c;系統和前端頁面之間的交互&#xff0c;通常給開發和維護帶來很大的便利性。但操作系統和前端之間的交互卻是比較復雜的。具體來說就是腳本語言和編譯語言的交互。在IE內核中html和css雖然不兼容,但是IE編程接口是完全一樣的,這得益于微軟的…

多線程編程指南 part 2

多線程編程指南Sun Microsystems, Inc.4150 Network CircleSanta Clara, CA95054U.S.A.文件號碼819–7051–102006 年10 月版權所有2005 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, CA95054 U.S.A. 保留所有權利。本文檔及其相關產品的使用、復制、分發和反編譯…

00030_ArrayList集合

1、數組可以保存多個元素&#xff0c;但在某些情況下無法確定到底要保存多少個元素&#xff0c;此時數組將不再適用&#xff0c;因為數組的長度不可變 2、JDK中提供了一系列特殊的類&#xff0c;這些類可以存儲任意類型的元素&#xff0c;并且長度可變&#xff0c;統稱為集合 3…