Maison  >  Article  >  développement back-end  >  Comment analyser des pages HTML avec le robot d'exploration Python

Comment analyser des pages HTML avec le robot d'exploration Python

WBOY
WBOYavant
2023-05-30 21:41:422870parcourir

Analyser les pages HTML avec Python

Nous devons généralement analyser les pages Web explorées pour obtenir les données dont nous avons besoin. En analysant la structure combinée des balises HTML, nous pouvons extraire des informations utiles contenues dans les pages Web. En Python, il existe trois manières courantes d'analyser le HTML : l'analyse des expressions régulières, l'analyse XPath et l'analyse des sélecteurs CSS.

La structure des pages HTML

Comprendre la structure de base des pages HTML est un prérequis avant d'expliquer la méthode d'analyse HTML. Lorsque nous ouvrons un site Web dans un navigateur et sélectionnons l'élément de menu « Afficher le code source de la page Web » via le menu contextuel de la souris, nous pouvons voir le code HTML correspondant à la page Web. Le code HTML se compose généralement de balises, d'attributs et de texte. L'étiquette porte le contenu affiché sur la page, les attributs complètent les informations de l'étiquette et le texte est le contenu affiché par l'étiquette. Voici un exemple simple de structure de code de page HTML :

<!DOCTYPE html>
<html>
    <head>
        <!-- head 标签中的内容不会在浏览器窗口中显示 -->
        <title>这是页面标题</title>
    </head>
    <body>
        <!-- body 标签中的内容会在浏览器窗口中显示 -->
        <h2>这是一级标题</h2>
        <p>这是一段文本</p>
    </body>
</html>

Dans cet exemple de code de page HTML, le contenu sous la balise 8b05045a5be5764f313ed5b9168a17e6是文档类型声明,100db36a723c770d327fc0aef2ce13b1标签是整个页面的根标签,93f0f5c25f18dab9d176bd4f6de5d30e6c04bd5ca3fcae76e30b72ad730ca86d100db36a723c770d327fc0aef2ce13b1标签的子标签,放在6c04bd5ca3fcae76e30b72ad730ca86d标签下的内容会显示在浏览器窗口中,这部分内容是网页的主体;放在93f0f5c25f18dab9d176bd4f6de5d30e ne sera pas affiché dans la fenêtre du navigateur, mais il contient des méta-informations importantes de la page, généralement appelées The en-tête de la page Web. La structure générale du code d'une page HTML est la suivante :

<!DOCTYPE html>
<html>
    <head>
        <!-- 页面的元信息,如字符编码、标题、关键字、媒体查询等 -->
    </head>
    <body>
        <!-- 页面的主体,显示在浏览器窗口中的内容 -->
    </body>
</html>

Les balises, les feuilles de style en cascade (CSS) et JavaScript sont les trois composants de base qui composent une page HTML. Les balises sont utilisées pour transporter le contenu à afficher sur la page, CSS est responsable du rendu de la page et JavaScript est utilisé pour contrôler le comportement interactif de la page. Pour analyser les pages HTML, vous pouvez utiliser la syntaxe XPath, qui est à l'origine une syntaxe de requête pour XML. Elle peut extraire le contenu ou les attributs de balises en fonction de la structure hiérarchique des balises HTML. De plus, vous pouvez également utiliser des sélecteurs CSS pour localiser les pages. Les éléments sont identiques au rendu des éléments de page à l'aide de CSS.

Analyse XPath

XPath est une syntaxe permettant de rechercher des informations dans des documents XML (eXtensible Markup Language). XML est similaire au HTML et est un langage de balises qui utilise des balises pour transporter des données. être personnalisé et XML a des exigences de syntaxe plus strictes. XPath utilise des expressions de chemin pour sélectionner des nœuds ou des ensembles de nœuds dans les documents XML. Les nœuds mentionnés ici incluent des éléments, des attributs, du texte, des espaces de noms, des instructions de traitement, des commentaires, des nœuds racine, etc.

L'expression du chemin XPath est similaire à la syntaxe du chemin de fichier, vous pouvez utiliser "/" et "//" pour sélectionner des nœuds. Lors de la sélection du nœud racine, vous pouvez utiliser une seule barre oblique "/" ; lors de la sélection d'un nœud à n'importe quelle position, vous pouvez utiliser une double barre oblique "//". Par exemple, "/bookstore/book" signifie sélectionner tous les sous-nœuds de livre sous la librairie du nœud racine, et "//title" signifie sélectionner le nœud de titre à n'importe quelle position.

XPath peut également utiliser un prédicat pour filtrer les nœuds. Les expressions imbriquées entre crochets peuvent être des nombres, des opérateurs de comparaison ou des appels de fonction qui servent de prédicats. Par exemple, "/bookstore/book[1]" signifie sélectionner le premier nœud enfant livre de la librairie, et "//book[@lang]" signifie sélectionner tous les nœuds livre avec l'attribut lang.

Les fonctions XPath incluent des fonctions de chaîne, mathématiques, logiques, de nœuds, de séquence et autres. Ces fonctions peuvent être utilisées pour sélectionner des nœuds, calculer des valeurs, convertir des types de données et d'autres opérations. Par exemple, la fonction « string-length(string) » peut renvoyer la longueur de la chaîne et la fonction « count(node-set) » peut renvoyer le nombre de nœuds dans l’ensemble de nœuds.

Ci-dessous, nous utilisons un exemple pour illustrer comment utiliser XPath pour analyser la page. Supposons que nous ayons le fichier XML suivant :

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book>
      <title lang="eng">Harry Potter</title>
      <price>29.99</price>
    </book>
    <book>
      <title lang="zh">Learning XML</title>
      <price>39.95</price>
    </book>
</bookstore>

Pour ce fichier XML, nous pouvons utiliser la syntaxe XPath comme indiqué ci-dessous pour obtenir les nœuds du document.

Expression de chemin result
/bookstore Sélectionnez la librairie de l'élément racine. Remarque : Si le chemin commence par une barre oblique ( / ), ce chemin représente toujours un chemin absolu vers un élément !
//book Sélectionne tous les éléments enfants du livre quelle que soit leur position dans le document.
//@lang Sélectionnez tous les attributs nommés lang.
/bookstore/book[1] Sélectionnez le premier livre de nœud enfant de la librairie.

CSS 选择器解析

通过HTML标签的属性和关系来定位元素的方式被称为CSS选择器。根据 HTML 标签的层级结构、类名、id 等属性能够确定元素的位置。在 Python 中,我们可以使用 BeautifulSoup 库来进行 CSS 选择器解析。

我们接下来会举一个例子,讲解如何运用 CSS 选择器来分析页面。假设我们有如下的 HTML 代码:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>这是页面标题</title>
</head>
<body>
	<div class="content">
		<h2>这是一级标题</h2>
		<p>这是一段文本</p>
	</div>
	<div class="footer">
		<p>版权所有 © 2021</p>
	</div>
</body>
</html>

我们可以使用如下所示的 CSS 选择器语法来选取页面元素。

选择器 结果
div.content 选取 class 为 content 的 div 元素。
h2 选取所有的 h2 元素。
div.footer p 选取 class 为 footer 的 div 元素下的所有 p 元素。
[href] 选取所有具有 href 属性的元素。

正则表达式解析

用正则表达式可以解析 HTML 页面,从而实现文本的匹配、查找和替换。使用 re 模块可以进行 Python 的正则表达式解析。

下面我们通过一个例子来说明如何使用正则表达式对页面进行解析。假设我们有如下的 HTML 代码:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>这是页面标题</title>
</head>
<body>
	<div class="content">
		<h2>这是一级标题</h2>
		<p>这是一段文本</p>
	</div>
	<div class="footer">
		<p>版权所有 © 2021</p>
	</div>
</body>
</html>

我们可以使用如下所示的正则表达式来选取页面元素。

import re
html = '''
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>这是页面标题</title>
</head>
<body>
	<div class="content">
		<h2>这是一级标题</h2>
		<p>这是一段文本</p>
	</div>
	<div class="footer">
		<p>版权所有 © 2021</p>
	</div>
</body>
</html>
'''
pattern = re.compile(r'
.*?

(.*?)

.*?

(.*?)

.*?
', re.S) match = re.search(pattern, html) if match: title = match.group(1) text = match.group(2) print(title) print(text)

以上代码中,我们使用 re 模块的 compile 方法来编译正则表达式,然后使用 search 方法来匹配 HTML 代码。在正则表达式中,“.*?”表示非贪婪匹配,也就是匹配到第一个符合条件的标签就停止匹配,而“re.S”表示让“.”可以匹配包括换行符在内的任意字符。最后,我们使用 group 方法来获取匹配的结果。

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer