Lors de l'utilisation de ce robot d'exploration Python pour collecter des données, une opération très importante consiste à savoir comment extraire les données de la page Web demandée, et localiser correctement les données souhaitées est la première étape.
Cet article comparera les méthodes couramment utilisées pour localiser les éléments de pages Web dans plusieurs robots d'exploration Python pour que tout le monde puisse les apprendre
"
Traditionnel BeautifulSoup
opérationBeautifulSoup
操作基于 BeautifulSoup
的 CSS 选择器(与PyQuery
类似)XPath
- basée sur
Le sélecteur CSS de BeautifulSoup
(avecPyQuery
similaire)<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1</pre><div class="contentsignin">Copier après la connexion</div></div><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"><img src="https://img.php.cn/upload/article/001/267/443/21d313e128464b6c1113677cb281678c-1.jpg"/ alt="Comparaison de quatre méthodes couramment utilisées pour localiser des éléments dans les robots Python, laquelle préférez-vous ?" ></figure><p data-tool="mdnice编辑器" style="max-width:90%"> Prenons comme exemple le titre des 20 premiers livres. Assurez-vous d'abord que le site Web n'a pas mis en place de mesures anti-crawling et s'il peut renvoyer directement le contenu à analyser : </p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">import requests url = &#39;http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1&#39; response = requests.get(url).text print(response)</pre><div class="contentsignin">Copier après la connexion</div></div><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"><img src="https://img.php.cn/upload/article/001/267/443/21d313e128464b6c1113677cb281678c-2.png"/ alt="Comparaison de quatre méthodes couramment utilisées pour localiser des éléments dans les robots Python, laquelle préférez-vous ?" ></figure><p data-tool="mdnice编辑器" style="max-width:90%">Après une inspection minutieuse, il s'avère que toutes les données requises se trouvent dans le fichier renvoyé. contenu, indiquant qu'il n'est pas nécessaire d'envisager des mesures anti-crawling </p><p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;font-size: 16px;">Revoir les éléments de la page Web On pourra constater plus tard que les informations bibliographiques sont incluses dans <code style="padding: 2px 4px;border-radius: 4px;margin -droite : 2 px ; marge gauche : 2 px ; couleur d'arrière-plan : rgba (27, 31, 35, 0,05 ); famille de polices : "Operator Mono", Consolas, Monaco, Menlo, monospace ; coupure de mots : break-all ;couleur : rgb(255, 100, 65);font-size : 13px;">li</code > in, subordonné à <code style="padding : 2px 4px;border-radius : 4px;margin-right : 2px ;marge gauche : 2 px ; couleur d'arrière-plan : rgba (27, 31, 35, 0,05) ; famille de polices : « Operator Mono », Consolas, Monaco, Menlo, monospace ; saut de mot : break-all ; couleur : rgb (255, 100, 65);font-size : 13px;">class
estbang_list clearfix bang_list_mode
'sul
dansli
中,从属于class
为bang_list clearfix bang_list_mode
的ul
中进一步审查也可以发现书名在的相应位置,这是多种解析方法的重要基础
1. 传统 BeautifulSoup 操作
经典的 BeautifulSoup 方法借助
Un examen plus approfondi peut également révéler la position correspondante du titre du livre, qui constitue une base importante pour diverses méthodes d'analysefrom bs4 import BeautifulSoup
,然后通过soup = BeautifulSoup(html, "lxml")
将文本转换为特定规范的结构,利用find
🎜🎜 Vous avez obtenu avec succès 20 titres de livres. Certains d'entre eux sont longs et peuvent être traités via des expressions régulières ou d'autres méthodes de chaîne. Cet article ne les présentera pas en détail🎜.import requests from bs4 import BeautifulSoup url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' response = requests.get(url).text def bs_for_parse(response): soup = BeautifulSoup(response, "lxml") li_list = soup.find('ul', class_='bang_list clearfix bang_list_mode').find_all('li') # 锁定ul后获取20个li for li in li_list: title = li.find('div', class_='name').find('a')['title'] # 逐个解析获取书名 print(title) if __name__ == '__main__': bs_for_parse(response)Copier après la connexion2. 基于 BeautifulSoup 的 CSS 选择器
这种方法实际上就是 PyQuery 中 CSS 选择器在其他模块的迁移使用,用法是类似的。关于 CSS 选择器详细语法可以参考:
http://www.w3school.com.cn/cssref/css_selectors.asp
由于是基于 BeautifulSoup 所以导入的模块以及文本结构转换都是一致的:import requests from bs4 import BeautifulSoup url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' response = requests.get(url).text def css_for_parse(response): soup = BeautifulSoup(response, "lxml") print(soup) if __name__ == '__main__': css_for_parse(response)Copier après la connexion然后就是通过
soup.select
辅以特定的 CSS 语法获取特定内容,基础依旧是对元素的认真审查分析:import requests from bs4 import BeautifulSoup from lxml import html url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' response = requests.get(url).text def css_for_parse(response): soup = BeautifulSoup(response, "lxml") li_list = soup.select('ul.bang_list.clearfix.bang_list_mode > li') for li in li_list: title = li.select('div.name > a')[0]['title'] print(title) if __name__ == '__main__': css_for_parse(response)Copier après la connexion3. XPath
XPath 即为 XML 路径语言,它是一种用来确定 XML 文档中某部分位置的计算机语言,如果使用 Chrome 浏览器建议安装
XPath Helper
插件,会大大提高写 XPath 的效率。之前的爬虫文章基本都是基于 XPath,大家相对比较熟悉因此代码直接给出:
import requests from lxml import html url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' response = requests.get(url).text def xpath_for_parse(response): selector = html.fromstring(response) books = selector.xpath("//ul[@class='bang_list clearfix bang_list_mode']/li") for book in books: title = book.xpath('div[@class="name"]/a/@title')[0] print(title) if __name__ == '__main__': xpath_for_parse(response)Copier après la connexion4. 正则表达式
如果对 HTML 语言不熟悉,那么之前的几种解析方法都会比较吃力。这里也提供一种万能解析大法:正则表达式,只需要关注文本本身有什么特殊构造文法,即可用特定规则获取相应内容。依赖的模块是
re
首先重新观察直接返回的内容中,需要的文字前后有什么特殊:
import requests import re url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' response = requests.get(url).text print(response)Copier après la connexion观察几个数目相信就有答案了:
<div class="name"><a href="http://product.dangdang.com/xxxxxxxx.html" target="_blank" title="xxxxxxx">
书名就藏在上面的字符串中,蕴含的网址链接中末尾的数字会随着书名而改变。分析到这里正则表达式就可以写出来了:
import requests import re url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' response = requests.get(url).text def re_for_parse(response): reg = '<div class="name"><a href="http://product.dangdang.com/\d+.html" target="_blank" title="(.*?)">' for title in re.findall(reg, response): print(title) if __name__ == '__main__': re_for_parse(response)Copier après la connexion可以发现正则写法是最简单的,但是需要对于正则规则非常熟练。所谓正则大法好!
当然,不论哪种方法都有它所适用的场景,在真实操作中我们也需要在分析网页结构来判断如何高效的定位元素,最后附上本文介绍的四种方法的完整代码,大家可以自行操作一下来加深体会
import requests from bs4 import BeautifulSoup from lxml import html import re url = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1' response = requests.get(url).text def bs_for_parse(response): soup = BeautifulSoup(response, "lxml") li_list = soup.find('ul', class_='bang_list clearfix bang_list_mode').find_all('li') for li in li_list: title = li.find('div', class_='name').find('a')['title'] print(title) def css_for_parse(response): soup = BeautifulSoup(response, "lxml") li_list = soup.select('ul.bang_list.clearfix.bang_list_mode > li') for li in li_list: title = li.select('div.name > a')[0]['title'] print(title) def xpath_for_parse(response): selector = html.fromstring(response) books = selector.xpath("//ul[@class='bang_list clearfix bang_list_mode']/li") for book in books: title = book.xpath('div[@class="name"]/a/@title')[0] print(title) def re_for_parse(response): reg = '<div class="name"><a href="http://product.dangdang.com/\d+.html" target="_blank" title="(.*?)">' for title in re.findall(reg, response): print(title) if __name__ == '__main__': # bs_for_parse(response) # css_for_parse(response) # xpath_for_parse(response) re_for_parse(response)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!