Cet article présente principalement les informations pertinentes sur Python utilisant le module Beautiful Soup pour créer des objets. L'introduction dans l'article est très détaillée. Je pense qu'elle a une certaine valeur de référence pour tous les amis qui en ont besoin peuvent jeter un œil ci-dessous.
Installer
Installer le module Beautiful Soup via pip : pip install beautifulsoup4
.
Vous pouvez également utiliser PyCharm IDE pour écrire du code. Recherchez le projet dans les préférences de PyCharm, recherchez-y le module Beautiful Soup et installez-le.
Créer un objet BeautifulSoup
Le module Beautiful Soup est largement utilisé pour obtenir des données à partir de pages Web. Nous pouvons utiliser le module Beautiful Soup pour extraire toutes les données d'un document HTML/XML, par exemple tous les liens d'une page Web ou le contenu des balises.
Pour y parvenir, Beautiful Soup propose différents objets et méthodes. Tout document HTML/XML peut être converti en différents objets Beautiful Soup. Ces objets ont des propriétés et des méthodes différentes, et nous pouvons en extraire les données requises.
Beautiful Soup a un total de trois objets :
BeautifulSoup
Tag
NavigableString
Création d'un objet BeautifulSoup
Création d'un objet BeautifulSoup est le point de départ de toute Beautiful Soup projet.
BeautifulSoup peut transmettre une chaîne ou un objet semblable à un fichier, tel qu'un fichier ou une page Web sur la machine.
Créez un objet BeautifulSoup à partir d'une chaîne
Créez un objet BeautifulSoup en passant une chaîne dans son constructeur.
helloworld = '<p>Hello World</p>' soup_string = BeautifulSoup(helloworld) print soup_string <html><body><p>Hello World</p></body></html>
Créez un objet BeautifulSoup à partir d'un objet de type fichier
Créez un objet BeautifulSoup en passant un objet de type fichier dans son constructeur. Ceci est très utile lors de l’analyse de pages Web en ligne.
url = "http://www.glumes.com" page = urllib2.urlopen(url) soup = BeautifulSoup(page) print soup
En plus de transmettre des objets de type fichier, nous pouvons également transmettre des objets de fichier locaux au constructeur de BeautifulSoup pour générer des objets.
with open('foo.html','r') as foo_file : soup_foo = BeautifulSoup(foo_file) print soup_foo
Créez des objets BeautifulSoup pour l'analyse XML
Le module Beautiful Soup peut également être utilisé pour analyser XML.
Lors de la création d'un objet BeautifulSoup, le module Beautiful Soup sélectionnera la classe TreeBuilder appropriée pour créer l'arborescence HTML/XML. Par défaut, l'objet HTML TreeBuilder est sélectionné, qui utilisera l'analyseur HTML par défaut pour produire une arborescence de structure HTML. Dans le code ci-dessus, l'objet BeautifulSoup est généré à partir de la chaîne en l'analysant dans une arborescence HTML.
Si nous voulons que le module Beautiful Soup analyse le contenu d'entrée en type XML, nous devons alors spécifier avec précision le paramètre de fonctionnalités utilisé dans le constructeur Beautiful Soup. En spécifiant le paramètre de fonctionnalités, Beautiful Soup sélectionnera la classe TreeBuilder la plus adaptée pour répondre aux fonctionnalités souhaitées.
Comprendre le paramètre de fonctionnalités
Chaque TreeBuilder aura des fonctionnalités différentes en fonction de l'analyseur qu'il utilise. Par conséquent, le contenu d’entrée aura des résultats différents selon le paramètre de fonctionnalités transmis au constructeur.
Dans le module Beautiful Soup, les analyseurs actuellement utilisés par TreeBuilder sont les suivants :
lxml
html5lib
html.parser
Le paramètre Features du constructeur BeautifulSoup peut accepter une liste de chaînes ou une valeur de chaîne.
Actuellement, les paramètres de fonctionnalités et les analyseurs pris en charge par chaque TreeBuilder sont tels qu'indiqués dans le tableau suivant :
Features | TreeBuilder | Parser |
---|---|---|
[‘lxml','html','fast','permissive'] | LXMLTreeBuilder | lxml |
[‘html','html5lib','permissive','strict','html5′] | HTML5TreeBuilder | html5lib |
[‘html','strict','html.parser'] | HTMLParserTreeBuilder | html.parser |
[‘xml','lxml','permissive','fast'] | LXMLTreeBuilderForXML | lxml |
根据指定的 feature 参数,Beautiful Soup 将会选择最合适的 TreeBuilder 类。如果在指定对应的解析器时,出现如下的报错信息,可能就是需要安装对应的解析器了。
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html5lib. Do you need to install a parser library?
就 HTML 文档而言,选择 TreeBuilder 的顺序是基于解析器建立的优先级,就如上表格所示的优先级。首先是 lxml ,其次是 html5lib ,最后才是 html.parser 。例如,我们选择 html 字符串作为 feature 参数,那么如果 lxml 解析器可用,则 Beautiful Soup 模块将会选择 LXMLTreeBuilder 。如果 lxml 不可用,则会选择 根据 html5lib 解析器选择 HTML5TreeBuilder 。如果在不可用,则会选择根据 html.parser 选择 HTMLParserTreeBuilder 了。
至于 XML ,由于 lxml 是唯一的解析器,所以 LXMLTreeBuilderForXML 总是会被选择的。
所以,为 XML 创建一个 Beautiful Soup 对象的代码如下:
helloworld = '<p>Hello World</p>' soup_string = BeautifulSoup(helloworld,features="xml") print soup_string
输入的结果也是 XML 形式的文件 :
在创建 Beautiful Soup 对象时,更好的实践是指定解析器。这是因为,不同的解析器解析的结果内容大不相同,尤其是在我们的 HTML 文档内容非法时,结果更为明显。
当我们创建一个 BeautifulSoup 对象时,Tag 和 NavigableString 对象也就创建了。
创建 Tag 对象
我们可以从 BeautifulSoup 对象中得到 Tag 对象,也就是 HTML/XML 中的标签。
如下 HTML 代码所示:
#!/usr/bin/python # -*- coding:utf-8 -*- from bs4 import BeautifulSoup html_atag = """ <html> <body> <p>Test html a tag example</p> <a href="http://www.glumes.com'>Home</a> <a href="http;//www.glumes.com/index.html'>Blog</a> </body> <html> """ soup = BeautifulSoup(html_atag,'html.parser') atag = soup.a print type(atag) print atag
从结果中可以看到 atag 的类型是
HTML/XML 标签对象具有名称和属性。名称就是标签的名字,例如 标签 的名称就是 a 。属性则是标签的 class 、id 、style 等。Tag 对象允许我们得到 HTML 标签的名称和属性 。
Tag 对象的名称
通过 .name 方式得到 Tag 对象的名称 。
tagname = atag.name print tagname
同时也能够改变 Tag 对象的名称:
atag.name = 'p'