国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

Python模塊學(xué)習(xí)之bs4

2019-11-06 08:43:51
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1、安裝bs4

我用的Ubuntu14.4,直接用apt-get命令就行

sudo apt-get install Python-bs4

 

2、安裝解析器

Beautiful Soup支持Python標(biāo)準(zhǔn)庫(kù)中的HTML解析器,還支持一些第三方的解析器,其中一個(gè)是lxml

sudo apt-get install Python-lxml

 

3、如何使用

將一段文檔傳入BeautifulSoup的構(gòu)造方法,就能得到一個(gè)文檔的對(duì)象,可以傳入一段字符串或一個(gè)文件句柄。

from bs4 import BeautifulSoupsoup = BeautifulSoup(open("index.html"))soup = BeautifulSoup("<html>data</html>")

 

4、對(duì)象的種類

Beautfiful Soup將復(fù)雜HTML文檔轉(zhuǎn)換成一個(gè)復(fù)雜的樹(shù)形結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都是Python對(duì)象,所有對(duì)象可以歸納為4種:tag,NavigableString,BeautifulSoup,Comment。

tag

Tag對(duì)象與XML或HMTL原生文檔中的tag相同:

soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')tag = soup.btype(tag)# <class 'bs4.element.Tag'>

每個(gè)tag都有自己的名字,通過(guò).name來(lái)獲取:

tag.name# u'b'

一個(gè)tag可能有很多屬性。

tag['class']# u'boldest'
tag.attrs# {u'class': u'boldest'}

NavigableString

字符串常被包含在tag內(nèi)。

tag.string# u'Extremely bold'type(tag.string)# <class 'bs4.element.NavigableString'>

 

BeautifulSoup

BeautifulSoup對(duì)象表示的是一個(gè)文檔的全部?jī)?nèi)容。

soup<html><body><b class="boldest">Extremely bold</b></body></html>type(soup)<class 'bs4.BeautifulSoup'>

Comment

一般表示的是文檔的注釋部分。

 

5、遍歷文檔樹(shù)

tag的名字

可以通過(guò)點(diǎn)取屬性的方式獲取tag,并且可以多次調(diào)用。

soup.head# <head><title>The Dormouse's story</title></head>soup.title# <title>The Dormouse's story</title>

通過(guò)點(diǎn)取屬性的方式只能獲取當(dāng)前名字的第一個(gè)tag:

soup.a# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>

如果想獲取所有的a標(biāo)簽

soup.find_all('a')# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

6、搜索文檔樹(shù)

Beautiful Soup最重要的搜索方法有兩個(gè):find(),find_all()。

過(guò)濾器

最簡(jiǎn)單的過(guò)濾器是字符串

soup.find_all('b')# [<b>The Dormouse's story</b>]

通過(guò)傳入正則表達(dá)式來(lái)作為參數(shù)

import refor tag in soup.find_all(re.compile("^b")):    PRint(tag.name)# body# b

傳入列表參數(shù)

soup.find_all(["a", "b"])# [<b>The Dormouse's story</b>,#  <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

如果沒(méi)有合適的過(guò)濾器,還可以自定義方法

 

 

find_all()

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

name參數(shù)

name參數(shù)可以查找所有名字為name的tag,比如title/head/body/p等等

keyWord參數(shù)

如果一個(gè)指定名字的參數(shù)不是搜索內(nèi)置的參數(shù)名,搜索時(shí)會(huì)把該參數(shù)當(dāng)作指定名字tag的屬性來(lái)搜索,如果包含一個(gè)名字為 id 的參數(shù),Beautiful Soup會(huì)搜索每個(gè)tag的”id”屬性.

soup.find_all(id='link2')# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

如果傳入 href 參數(shù),Beautiful Soup會(huì)搜索每個(gè)tag的”href”屬性:

soup.find_all(href=re.compile("elsie"))# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]

搜索指定名字的屬性時(shí)可以使用的參數(shù)值包括 字符串 , 正則表達(dá)式 , 列表, True .

下面的例子在文檔樹(shù)中查找所有包含 id 屬性的tag,無(wú)論id 的值是什么:

soup.find_all(id=True)# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

使用多個(gè)指定名字的參數(shù)可以同時(shí)過(guò)濾tag的多個(gè)屬性:

soup.find_all(href=re.compile("elsie"), id='link1')# [<a class="sister" href="http://example.com/elsie" id="link1">three</a>]

CSS搜索

class由于與Python關(guān)鍵字沖突,因此在beatifulsoup中為class_

class_ 參數(shù)同樣接受不同類型的 過(guò)濾器 ,字符串,正則表達(dá)式,方法或 True

 

text參數(shù)

text參數(shù)可以搜索文檔中的字符串內(nèi)容。與 name 參數(shù)的可選值一樣,text 參數(shù)接受 字符串 , 正則表達(dá)式 , 列表, True。

像調(diào)用 find_all() 一樣調(diào)用tag

find_all() 幾乎是Beautiful Soup中最常用的搜索方法,所以我們定義了它的簡(jiǎn)寫方法.BeautifulSoup 對(duì)象和 tag 對(duì)象可以被當(dāng)作一個(gè)方法來(lái)使用,這個(gè)方法的執(zhí)行結(jié)果與調(diào)用這個(gè)對(duì)象的 find_all() 方法相同,下面兩行代碼是等價(jià)的:

soup.find_all("a")soup("a")

這兩行代碼也是等價(jià)的:

soup.title.find_all(text=True)soup.title(text=True)

 

CSS選擇器

Beautiful Soup支持大部分的CSS選擇器 [6] ,在 TagBeautifulSoup 對(duì)象的 .select() 方法中傳入字符串參數(shù),即可使用CSS選擇器的語(yǔ)法找到tag:

soup.select("title")# [<title>The Dormouse's story</title>]soup.select("p nth-of-type(3)")# [<p class="story">...</p>]

通過(guò)tag標(biāo)簽逐層查找:

soup.select("body a")# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,#  <a class="sister" href="http://example.com/lacie"  id="link2">Lacie</a>,#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]soup.select("html head title")# [<title>The Dormouse's story</title>]

找到某個(gè)tag標(biāo)簽下的直接子標(biāo)簽 [6] :

soup.select("head > title")# [<title>The Dormouse's story</title>]soup.select("p > a")# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,#  <a class="sister" href="http://example.com/lacie"  id="link2">Lacie</a>,#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]soup.select("p > a:nth-of-type(2)")# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]soup.select("p > #link1")# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]soup.select("body > a")# []

找到兄弟節(jié)點(diǎn)標(biāo)簽:

soup.select("#link1 ~ .sister")# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,#  <a class="sister" href="http://example.com/tillie"  id="link3">Tillie</a>]soup.select("#link1 + .sister")# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

通過(guò)CSS的類名查找:

soup.select(".sister")# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]soup.select("[class~=sister]")# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

通過(guò)tag的id查找:

soup.select("#link1")# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]soup.select("a#link2")# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

通過(guò)是否存在某個(gè)屬性來(lái)查找:

soup.select('a[href]')# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

通過(guò)屬性的值來(lái)查找:

soup.select('a[href="http://example.com/elsie"]')# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]soup.select('a[href^="http://example.com/"]')# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]soup.select('a[href$="tillie"]')# [<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]soup.select('a[href*=".com/el"]')# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]原文地址:點(diǎn)擊打開(kāi)鏈接 
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 万源市| 山东省| 酉阳| 岳池县| 镇巴县| 普陀区| 赣州市| 象州县| 云阳县| 绥阳县| 措勤县| 莎车县| 平利县| 饶平县| 安丘市| 抚顺市| 岫岩| 平远县| 明水县| 哈密市| 石阡县| 鄂伦春自治旗| 习水县| 南京市| 凤阳县| 岑巩县| 锦州市| 曲沃县| 上栗县| 修文县| 长阳| 凤庆县| 酉阳| 巴塘县| 定结县| 武威市| 阳春市| 漠河县| 陇西县| 阜平县| 田林县|