Maison > Article > développement back-end > Introduction aux robots d'exploration Python (4)--Explication détaillée de la bibliothèque d'analyse de texte HTML BeautifulSoup
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
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>
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'\u5982\u4f55\u4f7f\u7528BeautifulSoup'
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 'bs4.BeautifulSoup'> >>> type(soup.h1) <class 'bs4.element.Tag'> >>> type(soup.p.string) <class 'bs4.element.NavigableString'>
Tag
Chaque balise a un nom, qui correspond au nom de la balise HTML. Les balises
>>> soup.h1.name u'h1' >>> soup.p.name u'p'
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['class'] [u'bold']
. 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'\u5982\u4f55\u4f7f\u7528BeautifulSoup' >>> type(soup.p.string) <class 'bs4.element.NavigableString'> >>> unicode_str = unicode(soup.p.string) >>> unicode_str u'\u5982\u4f55\u4f7f\u7528BeautifulSoup'
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>
获取 p 标签
>>> soup.body.p <p class="bold">\u5982\u4f55\u4f7f\u7528BeautifulSoup</p>
获取 p 标签的内容
>>> soup.body.p.string \u5982\u4f55\u4f7f\u7528BeautifulSoup
前面说了,内容也是一个节点,这里就可以用 .string 的方式得到。遍历文档树的另一个缺点是只能获取到与之匹配的第一个子节点,例如,如果有两个相邻的 p 标签时,第二个标签就没法通过 .p 的方式获取,这是需要借用 next_sibling 属性获取相邻且在后面的节点。此外,还有很多不怎么常用的属性,比如:.contents 获取所有子节点,.parent 获取父节点,更多的参考请查看官方文档。
搜索文档树
搜索文档树是通过指定标签名来搜索元素,另外还可以通过指定标签的属性值来精确定位某个节点元素,最常用的两个方法就是 find 和 find_all。这两个方法在 BeatifulSoup 和 Tag 对象上都可以被调用。
find_all()
find_all( name , attrs , recursive , text , **kwargs )
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>]
第二个参数是标签的class属性值
# 找到所有class属性为big的p标签 >>> soup.find_all("p", "big") [<p class="big"> \xb5\xda\xb6\xfe\xb8\xf6p\xb1\xea\xc7\xa9</p>]
等效于
>>> soup.find_all("p", class_="big") [<p class="big"> \xb5\xda\xb6\xfe\xb8\xf6p\xb1\xea\xc7\xa9</p>]
因为 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>]
当然,它还支持正则表达式
>>> 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>]
属性除了可以是具体的值、正则表达式之外,它还可以是一个布尔值(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>]
遍历和搜索相结合查找,先定位到 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>]
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>
get_text()
获取标签里面内容,除了可以使用 .string 之外,还可以使用 get_text 方法,不同的地方在于前者返回的一个 NavigableString 对象,后者返回的是 unicode 类型的字符串。
>>> p1 = body_tag.find('p').get_text() >>> type(p1) <type 'unicode'> >>> p1 u'\xc8\xe7\xba\xce\xca\xb9\xd3\xc3BeautifulSoup' >>> p2 = body_tag.find("p").string >>> type(p2) <class 'bs4.element.NavigableString'> >>> p2 u'\xc8\xe7\xba\xce\xca\xb9\xd3\xc3BeautifulSoup' >>>
实际场景中我们一般使用 get_text 方法获取标签中的内容。
总结
BeatifulSoup 是一个用于操作 HTML 文档的 Python 库,初始化 BeatifulSoup 时,需要指定 HTML 文档字符串和具体的解析器。BeatifulSoup 有3类常用的数据类型,分别是 Tag、NavigableString、和 BeautifulSoup。查找 HTML元素有两种方式,分别是遍历文档树和搜索文档树,通常快速获取数据需要二者结合。
【相关推荐】
2. python爬虫入门(3)--利用requests构建知乎API
3. python爬虫入门(2)--HTTP库requests
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!