Introduction aux robots d'exploration Python (4)--Explication détaillée de la bibliothèque d'analyse de texte HTML BeautifulSoup

零下一度
Libérer: 2017-05-27 11:55:39
original
2108 Les gens l'ont consulté

Beautiful Soup est une bibliothèque en python. Sa fonction principale est de récupérer les données des pages Web. L'article suivant vous présente principalement les informations pertinentes de BeautifulSoup, la bibliothèque d'analyse de texte HTML du robot d'exploration Python. L'introduction dans l'article est très détaillée et a une certaine valeur de référence et d'apprentissage pour tous les amis qui en ont besoin peuvent y jeter un œil ci-dessous.

Avant-propos

Le troisième article de la série des robots d'exploration Python présente l'artefact de la bibliothèque de requêtes réseau Requêtes Une fois que la requête a renvoyé les données, elle doit le faire. être extrait. Données cibles, le contenu renvoyé par différents sites Web a généralement de nombreux formats différents, l'un est le format json, ce type de données est le plus convivial pour les développeurs. Un autre format XML, et le format le plus courant est le document HTML. Aujourd'hui, je vais parler de la façon d'extraire des données intéressantes du HTML

Écrire votre propre analyseur d'analyse HTML ? Ou utiliser une expression régulière ? Aucune de ces solutions n'est la meilleure. Heureusement, la communauté Python a déjà eu une solution très mature pour ce problème. BeautifulSoup est l'ennemi de ce type de problème. Il se concentre sur les opérations sur les documents HTML et son nom vient d'une chanson du même. nom par la poésie de Lewis Carroll.

BeautifulSoup est une bibliothèque Python pour analyser les documents HTML. Grâce à BeautifulSoup, vous n'avez besoin que de très peu de code pour extraire tout contenu intéressant en HTML. De plus, elle a également un certain degré de tolérance aux pannes HTML. pour gérer correctement un document HTML incomplètement formaté.

Installer BeautifulSoup

pip install beautifulsoup4
Copier après la connexion

BeautifulSoup3 a été officiellement abandonné pour maintenance, vous devez télécharger la dernière version BeautifulSoup4.

Balises HTML

Avant d'apprendre BeautifulSoup4, il est nécessaire d'avoir une compréhension de base des documents HTML. Le code suivant montre que HTML est un. structure organisationnelle arborescente.

<html> 
 <head>
  <title>hello, world</title>
 </head>
 <body>
  <h1>BeautifulSoup</h1>
  <p>如何使用BeautifulSoup</p>
 <body>
</html>
Copier après la connexion
  • Il se compose de nombreuses balises (Tag), telles que html, head, title, etc. sont toutes des balises

  • A paire de balises Constituer un nœud, tel que... C'est un nœud racine

  • Il existe une certaine relation entre les nœuds, tels que h1 et p sont voisins l'un de l'autre, ils sont adjacents nœuds frères

  • h1 est le nœud enfant direct de body ou le nœud descendant de html

  • body est le parent de p ) nœud, html est le nœud ancêtre de p

  • La chaîne imbriquée entre les balises est un nœud enfant spécial sous le nœud, comme "hello, world" aussi Un nœud, mais sans nom.

Utiliser BeautifulSoup

La construction d'un objet BeautifulSoup nécessite deux paramètres. Le premier paramètre est le code HTML à analyser. Une chaîne de texte, le deuxième paramètre indique à BeautifulSoup quel analyseur utiliser pour analyser le HTML.

L'analyseur est responsable de l'analyse du HTML en objets associés, tandis que BeautifulSoup est responsable de l'exploitation des données (ajouter, supprimer, modifier et interroger). "html.parser" est l'analyseur intégré de Python et "lxml" est un analyseur développé basé sur le langage C. Il s'exécute plus rapidement, mais il nécessite une installation supplémentaire

Il peut être localisé via l'objet BeautifulSoup sur n'importe quel objet. nœud de balise en HTML.

from bs4 import BeautifulSoup 
text = """
<html> 
 <head>
  <title >hello, world</title>
 </head>
 <body>
  <h1>BeautifulSoup</h1>
  <p class="bold">如何使用BeautifulSoup</p>
  <p class="big" id="key1"> 第二个p标签</p>
  <a href="http://foofish.net" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >python</a>
 </body>
</html> 
"""
soup = BeautifulSoup(text, "html.parser")

# title 标签
>>> soup.title
<title>hello, world</title>

# p 标签
>>> soup.p
<p class="bold">\u5982\u4f55\u4f7f\u7528BeautifulSoup</p>

# p 标签的内容
>>> soup.p.string
u&#39;\u5982\u4f55\u4f7f\u7528BeautifulSoup&#39;
Copier après la connexion

BeatifulSoup résume le HTML en 4 types principaux de types de données, à savoir Tag, NavigableString, BeautifulSoup et Comment. Chaque nœud de balise est un objet Tag. Les objets NavigableString sont généralement des chaînes enveloppées dans des objets Tag qui représentent l'intégralité du document HTML. Par exemple :

>>> type(soup)
<class &#39;bs4.BeautifulSoup&#39;>
>>> type(soup.h1)
<class &#39;bs4.element.Tag&#39;>
>>> type(soup.p.string)
<class &#39;bs4.element.NavigableString&#39;>
Copier après la connexion

Tag

Chaque balise a un nom, qui correspond au nom de la balise HTML. Les balises


>>> soup.h1.name
u&#39;h1&#39;
>>> soup.p.name
u&#39;p&#39;
Copier après la connexion

peuvent également avoir des attributs. La méthode d'accès aux attributs est similaire à celle des dictionnaires. Elle renvoie un objet liste

>>> soup.p[&#39;class&#39;]
[u&#39;bold&#39;]
Copier après la connexion

. NavigableString

Pour obtenir le contenu de la balise, vous pouvez l'obtenir directement en utilisant .stirng. Il s'agit d'un objet NavigableString et vous pouvez le convertir explicitement en. une chaîne Unicode.

>>> soup.p.string
u&#39;\u5982\u4f55\u4f7f\u7528BeautifulSoup&#39;
>>> type(soup.p.string)
<class &#39;bs4.element.NavigableString&#39;>
>>> unicode_str = unicode(soup.p.string)
>>> unicode_str
u&#39;\u5982\u4f55\u4f7f\u7528BeautifulSoup&#39;
Copier après la connexion

Après avoir introduit les concepts de base, nous pouvons maintenant entrer officiellement dans le sujet Comment trouver les données qui nous intéressent à partir du HTML ? BeautifulSoup propose deux méthodes, l'une est la traversée et l'autre la recherche. Habituellement, les deux sont combinées pour terminer la tâche de recherche.

Parcourir l'arborescence du document

Parcourir l'arborescence du document Comme son nom l'indique, il commence à partir de la balise HTML du nœud racine et parcourt jusqu'à la balise HTML du nœud racine. L'élément cible est trouvé. L'un des inconvénients de est que si le contenu que vous recherchez se trouve à la fin du document, il doit parcourir tout le document pour le trouver, ce qui est lent. Il est donc nécessaire de coopérer avec la deuxième méthode.

L'obtention des nœuds de balise en parcourant l'arborescence du document peut être obtenue directement via le nom de la balise, par exemple :

Obtention de la balise body :

>>> soup.body
<body>\n<h1>BeautifulSoup</h1>\n<p class="bold">\u5982\u4f55\u4f7f\u7528BeautifulSoup</p>\n</body>
Copier après la connexion

获取 p 标签

>>> soup.body.p
<p class="bold">\u5982\u4f55\u4f7f\u7528BeautifulSoup</p>
Copier après la connexion

获取 p 标签的内容

>>> soup.body.p.string
\u5982\u4f55\u4f7f\u7528BeautifulSoup
Copier après la connexion

前面说了,内容也是一个节点,这里就可以用 .string 的方式得到。遍历文档树的另一个缺点是只能获取到与之匹配的第一个子节点,例如,如果有两个相邻的 p 标签时,第二个标签就没法通过 .p 的方式获取,这是需要借用 next_sibling 属性获取相邻且在后面的节点。此外,还有很多不怎么常用的属性,比如:.contents 获取所有子节点,.parent 获取父节点,更多的参考请查看官方文档。

搜索文档树

搜索文档树是通过指定标签名来搜索元素,另外还可以通过指定标签的属性值来精确定位某个节点元素,最常用的两个方法就是 find 和 find_all。这两个方法在 BeatifulSoup 和 Tag 对象上都可以被调用。

find_all()

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

find_all 的返回值是一个 Tag 组成的列表,方法调用非常灵活,所有的参数都是可选的。

第一个参数 name 是标签节点的名字。

# 找到所有标签名为title的节点
>>> soup.find_all("title")
[<title>hello, world</title>]
>>> soup.find_all("p")
[<p class="bold">\xc8\xe7\xba\xce\xca\xb9\xd3\xc3BeautifulSoup</p>, 
<p class="big"> \xb5\xda\xb6\xfe\xb8\xf6p\xb1\xea\xc7\xa9</p>]
Copier après la connexion

第二个参数是标签的class属性值

# 找到所有class属性为big的p标签
>>> soup.find_all("p", "big")
[<p class="big"> \xb5\xda\xb6\xfe\xb8\xf6p\xb1\xea\xc7\xa9</p>]
Copier après la connexion

等效于

>>> soup.find_all("p", class_="big")
[<p class="big"> \xb5\xda\xb6\xfe\xb8\xf6p\xb1\xea\xc7\xa9</p>]
Copier après la connexion

因为 class 是 Python 关键字,所以这里指定为 class_。

kwargs 是标签的属性名值对,例如:查找有href属性值为 "http://foofish.net" 的标签

>>> soup.find_all(href="foofish.net" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" )
[<a href="foofish.net" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >python</a>]
Copier après la connexion

当然,它还支持正则表达式

>>> import re
>>> soup.find_all(href=re.compile("^http"))
[<a href="http://foofish.net" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >python</a>]
Copier après la connexion

属性除了可以是具体的值、正则表达式之外,它还可以是一个布尔值(True/Flase),表示有属性或者没有该属性。

>>> soup.find_all(id="key1")
[<p class="big" id="key1"> \xb5\xda\xb6\xfe\xb8\xf6p\xb1\xea\xc7\xa9</p>]
>>> soup.find_all(id=True)
[<p class="big" id="key1"> \xb5\xda\xb6\xfe\xb8\xf6p\xb1\xea\xc7\xa9</p>]
Copier après la connexion

遍历和搜索相结合查找,先定位到 body 标签,缩小搜索范围,再从 body 中找 a 标签。

>>> body_tag = soup.body
>>> body_tag.find_all("a")
[<a href="http://foofish.net" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >python</a>]
Copier après la connexion

find()

find 方法跟 find_all 类似,唯一不同的地方是,它返回的单个 Tag 对象而非列表,如果没找到匹配的节点则返回 None。如果匹配多个 Tag,只返回第0个。

>>> body_tag.find("a")
<a href="foofish.net" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >python</a>
>>> body_tag.find("p")
<p class="bold">\xc8\xe7\xba\xce\xca\xb9\xd3\xc3BeautifulSoup</p>
Copier après la connexion

get_text()

获取标签里面内容,除了可以使用 .string 之外,还可以使用 get_text 方法,不同的地方在于前者返回的一个 NavigableString 对象,后者返回的是 unicode 类型的字符串。

>>> p1 = body_tag.find(&#39;p&#39;).get_text()
>>> type(p1)
<type &#39;unicode&#39;>
>>> p1
u&#39;\xc8\xe7\xba\xce\xca\xb9\xd3\xc3BeautifulSoup&#39;

>>> p2 = body_tag.find("p").string
>>> type(p2)
<class &#39;bs4.element.NavigableString&#39;>
>>> p2
u&#39;\xc8\xe7\xba\xce\xca\xb9\xd3\xc3BeautifulSoup&#39;
>>>
Copier après la connexion

实际场景中我们一般使用 get_text 方法获取标签中的内容。

总结

BeatifulSoup 是一个用于操作 HTML 文档的 Python 库,初始化 BeatifulSoup 时,需要指定 HTML 文档字符串和具体的解析器。BeatifulSoup 有3类常用的数据类型,分别是 Tag、NavigableString、和 BeautifulSoup。查找 HTML元素有两种方式,分别是遍历文档树和搜索文档树,通常快速获取数据需要二者结合。

【相关推荐】

1. python爬虫入门(5)--正则表达式实例教程

2. python爬虫入门(3)--利用requests构建知乎API

3. python爬虫入门(2)--HTTP库requests

4.  总结Python的逻辑运算符and

5. python爬虫入门(1)--快速理解HTTP协议

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:php.cn
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!