Introduction détaillée à BeautifulSoup en python (avec code)

不言
Libérer: 2018-12-12 09:40:46
avant
2845 Les gens l'ont consulté

Cet article vous apporte une introduction détaillée à BeautifulSoup en python (avec code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

Beautiful Soup fournit des fonctions simples de style python pour gérer la navigation, la recherche, la modification des arbres d'analyse et d'autres fonctions. Il s'agit d'une boîte à outils qui fournit aux utilisateurs les données dont ils ont besoin pour analyser des documents. Parce que c'est simple, vous pouvez écrire une application complète sans beaucoup de code. Beautiful Soup convertit automatiquement les documents d'entrée en codage Unicode et les documents de sortie en codage UTF-8. Vous n'avez pas besoin de prendre en compte la méthode de codage, sauf si le document ne spécifie pas de méthode de codage, auquel cas Beautiful Soup ne peut pas identifier automatiquement la méthode de codage. Ensuite, il vous suffit de spécifier la méthode d’encodage d’origine. Beautiful Soup est devenu un excellent interpréteur Python comme lxml et html6lib, offrant aux utilisateurs la flexibilité de proposer différentes stratégies d'analyse ou une vitesse élevée.

Installation

pip install BeautifulSoup4
easy_install BeautifulSoup4
Copier après la connexion

Créer un objet BeautifulSoup

Vous devez d'abord importer la bibliothèque de classes BeautifulSoup depuis bs4 import BeautifulSoup

Démarrer en créant l'objet ci-dessous, pour faciliter la démonstration avant de commencer, créez d'abord un texte html, comme suit :

html = """
<html><head><title>The Dormouse&#39;s story</title></head>
<body>
<p class="title" name="dromouse"><b>The Dormouse&#39;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>
"""
Copier après la connexion

Créez un objet : soupe=BeautifulSoup(html,'lxml'), où lxml est la classe analysée bibliothèque, À l'heure actuelle, je pense personnellement que c'est le meilleur analyseur que j'ai utilisé celui-ci. Méthode d'installation : pip install lxml

Tag

Tag est une balise. en html. Vous pouvez utiliser BeautifulSoup pour analyser le contenu spécifique de Tag. Le format spécifique est soupe.name, où name est la balise sous html. L'exemple spécifique est le suivant :

print soup.title génère le. contenu sous la balise de titre, y compris cette balise, cela affichera L'histoire du Loir

print soup.head

Remarque :

Le format ici Seule la première de ces balises peut être obtenue. La méthode d'obtention de plusieurs balises sera abordée plus tard. Il existe deux attributs importants pour Tag, name et attrs, qui représentent respectivement les noms et les attributs :

name : Pour Tag, son nom est lui-même, par exemple soup.p.name est p.

attrs est un type de dictionnaire, correspondant à des attributs-valeurs, tels que print soup.p.attrs, la sortie est {'class': ['title'], 'name': 'dromouse'}, bien sûr, vous pouvez également obtenir des valeurs spécifiques, telles que print soup.p.attrs['class']. Le résultat est que [title] est un type de liste, car un attribut peut correspondre à plusieurs valeurs. Bien sûr, vous pouvez également obtenir. obtenez-le via la méthode get Attributs, tels que : print soup.p.get('class'). Vous pouvez également utiliser directement la méthode print soup.p['class']

get

get pour obtenir la valeur de l'attribut sous l'étiquette. Notez qu'il s'agit d'un élément important. méthode. , peut être utilisée dans de nombreuses situations. Par exemple, si vous souhaitez obtenir l'URL de l'image sous la balise , vous pouvez utiliser soup.img.get('src'). L'analyse spécifique est la suivante :

print soup.p.get("class")   #得到第一个p标签下的src属性
Copier après la connexion

string

Obtenir le contenu du texte sous l'étiquette Le contenu ne peut être renvoyé que s'il n'y a pas de sous-étiquette sous cette étiquette, ou là. n'est qu'une sous-étiquette, sinon None est renvoyé Plus précisément. L'exemple est le suivant :

print soup.p.string #在上面的一段文本中p标签没有子标签,因此能够正确返回文本的内容
print soup.html.string  #这里得到的就是None,因为这里的html中有很多的子标签
Copier après la connexion

get_text()

peut obtenir tout le contenu textuel d'une balise, y compris le contenu. de nœuds descendants. C'est la méthode la plus couramment utilisée

rechercher l'arborescence du document

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

find_all est utilisé pour recherchez tous les nœuds du nœud qui répondent aux conditions de filtre

Paramètre 1.name : C'est le nom du tag, tel que p, p, title .....

soupe. find_all("p") trouve toutes les balises p et renvoie [L'histoire du Loir] , chaque nœud peut être obtenu en parcourant, comme suit :

ps=soup.find_all("p")
for p in ps:
print p.get(&#39;class&#39;)   #得到p标签下的class属性
Copier après la connexion

Passez l'expression régulière : soup.find_all(re.compile(r'^b') pour trouver toutes les balises commençant par b, ici Les balises body et b seront recherchées

Passer dans la liste de classe : Si vous transmettez le paramètre de liste , BeautifulSoup renverra le contenu correspondant à n'importe quel élément de la liste. Le code suivant recherche toutes les balises <a> et <b>Tag

soup.find_all(["a", "b"])
Copier après la connexion

2. Le paramètre KeyWords doit transmettre les attributs et les valeurs d'attribut correspondantes, ou quelques autres expressions

soup.find_all(id='link2') , cela recherchera et trouvera toutes les balises avec l'attribut id link2 Pass dans l'expression régulière soup.find_all(href=re.compile("elsie. ")), cela trouvera toutes les balises dont l'attribut href satisfait l'expression régulière <. 🎜>Passez plusieurs valeurs : soup.find_all(id='link2',class_='title'), cela trouvera les balises qui satisfont les deux attributs . La classe ici doit être transmise avec les paramètres class_. Parce que class est un mot-clé en python

Certains attributs ne peuvent pas être recherchés directement via la méthode ci-dessus, comme les attributs data-* en HTML5. spécifiez un paramètre de dictionnaire via le paramètre attrs pour rechercher des balises contenant des attributs spéciaux, comme suit :

# [<p data-foo="value">foo!</p>]
data_soup.find_all(attrs={"data-foo": "value"})   #注意这里的atts不仅能够搜索特殊属性,亦可以搜索普通属性
soup.find_all("p",attrs={&#39;class&#39;:&#39;title&#39;,&#39;id&#39;:&#39;value&#39;})  #相当与soup.find_all(&#39;p&#39;,class_=&#39;title&#39;,id=&#39;value&#39;)
Copier après la connexion
3. Paramètre de texte : Vous pouvez rechercher le contenu de la chaîne dans le document via le paramètre de texte facultatif. valeur du paramètre name, le paramètre text accepte les chaînes, les expressions régulières, les listes, True

soup.find_all(text="Elsie")
# [u&#39;Elsie&#39;]
 
soup.find_all(text=["Tillie", "Elsie", "Lacie"])
# [u&#39;Elsie&#39;, u&#39;Lacie&#39;, u&#39;Tillie&#39;]
 
soup.find_all(text=re.compile("Dormouse"))
[u"The Dormouse&#39;s story", u"The Dormouse&#39;s story"]
Copier après la connexion

4.limit参数:find_all() 方法返回全部的搜索结构,如果文档树很大那么搜索会很慢.如果我们不需要全部结果,可以使用 limit 参数限制返回结果的数量.效果与SQL中的limit关键字类似,当搜索到的结果数量达到 limit 的限制时,就停止搜索返回结果.

文档树中有3个tag符合搜索条件,但结果只返回了2个,因为我们限制了返回数量,代码如下:

soup.find_all("a", limit=2)
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
Copier après la connexion

5.recursive 参数:调用tag的 find_all() 方法时,BeautifulSoup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False

find( name , attrs , recursive , text , **kwargs )
Copier après la connexion

它与 find_all() 方法唯一的区别是 find_all() 方法的返回结果是值包含一个元素的列表,而 find() 方法直接返回结果,就是直接返回第一匹配到的元素,不是列表,不用遍历,如soup.find("p").get("class")

css选择器

我们在写 CSS 时,标签名不加任何修饰,类名前加点,id名前加#,在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list

通过标签名查找

print soup.select(&#39;title&#39;) 
#[<title>The Dormouse&#39;s story</title>]
print soup.select(&#39;a&#39;)
#[<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>]
Copier après la connexion

通过类名查找

print soup.select(&#39;.sister&#39;)
#[<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>]
Copier après la connexion

通过id名查找

print soup.select(&#39;#link1&#39;)
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
Copier après la connexion

组合查找

学过css的都知道css选择器,如p #link1是查找p标签下的id属性为link1的标签

print soup.select(&#39;p #link1&#39;)    #查找p标签中内容为id属性为link1的标签
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
print soup.select("head > title")   #直接查找子标签
#[<title>The Dormouse&#39;s story</title>]
Copier après la connexion

属性查找

查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配到。

print soup.select(&#39;a[class="sister"]&#39;)
#[<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>]
print soup.select(&#39;a[href="http://example.com/elsie"]&#39;)
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
Copier après la connexion

同样,属性仍然可以与上述查找方式组合,不在同一节点的空格隔开,同一节点的不加空格,代码如下:

print soup.select(&#39;p a[href="http://example.com/elsie"]&#39;)
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
Copier après la connexion

以上的 select 方法返回的结果都是列表形式,可以遍历形式输出,然后用 get_text() 方法来获取它的内容

soup = BeautifulSoup(html, &#39;lxml&#39;)
print type(soup.select(&#39;title&#39;))
print soup.select(&#39;title&#39;)[0].get_text()
for title in soup.select(&#39;title&#39;):
    print title.get_text()
Copier après la connexion

修改文档树

Beautiful
Soup的强项是文档树的搜索,但同时也可以方便的修改文档树,这个虽说对于一些其他的爬虫并不适用,因为他们都是爬文章的内容的,并不需要网页的源码并且修改它们

修改tag的名称和属性

html="""
<p><a href=&#39;#&#39;>修改文档树</a></p>
"""
soup=BeautifulSoup(html,&#39;lxml&#39;)
tag=soup.a    #得到标签a,可以使用print tag.name输出标签
tag[&#39;class&#39;]=&#39;content&#39;    #修改标签a的属性class和p
tag[&#39;p&#39;]=&#39;nav&#39;
Copier après la connexion

修改.string

注意这里如果标签的中还嵌套了子孙标签,那么如果直接使用string这个属性会将这里的所有的子孙标签都覆盖掉

html="""
<p><a href=&#39;#&#39;>修改文档树</a></p>
"""
soup=BeautifulSoup(html,&#39;lxml&#39;)
tag=soup.a
tag.string=&#39;博客&#39;   #这里会将修改文档树变成修改的内容
print  tag
soup.p.string=&#39;博客&#39;   #这里修改了p标签的内容,那么就会覆盖掉a标签,直接变成的修改后的文本
print soup
Copier après la connexion

append

append的方法的作用是在在原本标签文本后面附加文本,就像python中列表的append方法

html="""
<p><a href=&#39;#&#39;>修改文档树</a></p>
"""
soup=BeautifulSoup(html,&#39;lxml&#39;)
soup.a.append("博客")    #在a标签和面添加文本,这里的文本内容将会变成修改文档树陈加兵的博客
print soup
print soup.a.contents    #这里输出a标签的内容,这里的必定是一个带有两个元素的列表
Copier après la connexion

注意这里的append方法也可以将一个新的标签插入到文本的后面,下面将会讲到

new_tag

相信学过js的朋友都知道怎样创建一个新的标签,这里的方法和js中的大同小异,使用的new_tag
html="""
<p><p>
"""
soup=BeautifulSoup(html,&#39;lxml&#39;)
tag=soup.p
new_tag=soup.new_tag(&#39;a&#39;)    #创建一个新的标签a
new_tag[&#39;href&#39;]=&#39;#&#39;    #添加属性
new_tag.string=&#39;博客&#39;  #添加文本
print new_tag      
tag.append(new_tag)    #将新添加的标签写入到p标签中
print tag
Copier après la connexion

insert

Tag.insert() 方法与 Tag.append() 方法类似,区别是不会把新元素添加到父节点 .contents
属性的最后,而是把元素插入到指定的位置.与Python列表总的 .insert() 方法的用法下同:
html="""
<p><p>
"""
soup=BeautifulSoup(html,&#39;lxml&#39;)
tag=soup.p
new_tag=soup.new_tag(&#39;a&#39;)
new_tag[&#39;href&#39;]=&#39;#&#39;
new_tag.string=&#39;博客&#39;
tag.append("欢迎来到")  #这里向p标签中插入文本,这个文本在contents下的序号为0
tag.insert(1,new_tag)   #在contents序号为1的位置插入新的标签,如果这里修改成0,那么将会出现a标签将会出现在欢饮来到的前面
print tag
Copier après la connexion
注意这的1是标签的内容在contents中的序号,可以用print tag.contents查看当前的内容

insert_before() 和 insert_after()

insert_before() 方法在当前tag或文本节点前插入内容,insert_after() 方法在当前tag或文本节点后插入内容:

soup = BeautifulSoup("<b>stop</b>")
tag = soup.new_tag("i")
tag.string = "Don&#39;t"
soup.b.string.insert_before(tag)
soup.b
# <b><i>Don&#39;t</i>stop</b>
soup.b.i.insert_after(soup.new_string(" ever "))
soup.b
# <b><i>Don&#39;t</i> ever stop</b>
soup.b.contents
# [<i>Don&#39;t</i>, u&#39; ever &#39;, u&#39;stop&#39;]
Copier après la connexion

clear

clear用来移除当前节点的所有的内容,包括其中的子孙节点和文本内容

html="""
<p><p>
"""
soup=BeautifulSoup(html,&#39;lxml&#39;)
tag=soup.p
new_tag=soup.new_tag(&#39;a&#39;)
new_tag[&#39;href&#39;]=&#39;#&#39;
new_tag.string=&#39;博客&#39;
tag.append("欢迎来到")
tag.insert(1,new_tag)
tag.clear()    #这里将会移除所有内容
print tag
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal