四种Python爬虫常用的定位元素方法对比,你偏爱哪一款?

IT科技2025-11-05 13:50:228

在使用Python本爬虫采集数据时,爬偏爱一个很重要的虫常操作就是如何从请求到的网页中提取数据,而正确定位想要的用的元素数据又是第一步操作。

本文将对比几种 Python 爬虫中比较常用的定位对比定位网页元素的方式供大家学习:

传统 BeautifulSoup 操作 基于 BeautifulSoup 的 CSS 选择器(与 PyQuery 类似) XPath 正则表达式

参考网页是当当网图书畅销总榜:

http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1

我们以获取第一页 20 本书的书名为例。先确定网站没有设置反爬措施,爬偏爱是虫常否能直接返回待解析的内容:

import requests 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) 

仔细检查后发现需要的数据都在返回内容中,说明不需要特别考虑反爬举措

审查网页元素后可以发现,用的元素书目信息都包含在 li 中,定位对比从属于 class 为 bang_list clearfix bang_list_mode 的爬偏爱 ul 中

进一步审查也可以发现书名在的相应位置,这是虫常多种解析方法的重要基础

1. 传统 BeautifulSoup 操作

经典的 BeautifulSoup 方法借助 from bs4 import BeautifulSoup,然后通过 soup = BeautifulSoup(html,用的元素 "lxml") 将文本转换为特定规范的云南idc服务商结构,利用 find 系列方法进行解析,定位对比代码如下:

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) 

成功获取了 20 个书名,有些书面显得冗长可以通过正则或者其他字符串方法处理,虫常本文不作详细介绍

2. 基于 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) 

然后就是通过 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) 

3. 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) 

4. 正则表达式如果对 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) 

观察几个数目相信就有答案了:<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) 

可以发现正则写法是最简单的,但是需要对于正则规则非常熟练。所谓正则大法好!

当然,不论哪种方法都有它所适用的场景,在真实操作中我们也需要在分析网页结构来判断如何高效的定位元素,最后附上本文介绍的四种方法的完整代码,大家可以自行操作一下来加深体会

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) 
本文地址:http://www.bzuk.cn/html/98b31399588.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

热门文章

全站热门

一些Linux用户发现当Ubuntu14.04或14.10从睡眠和待机状态恢复时,鼠标或键盘会出现卡死的情况。那么,我们该怎么解决这个问题呢?现在小编就和大家分享下这个问题的解决方法。解决方法:这个问题的是由内核升级导致的。为何导致这一情况不得而知,但是看起来好像仅需重装输入设备的驱动就能解决了。sudo apt-get install --reinstall xserver-xorg-input-all以上就是解决Ubuntu14.04或14.10从睡眠和待机状态恢复时,鼠标或键盘会出现卡死的方法了,有遇到这个问题的用户快去试试吧。

以米为手机电池(探索米粒电池的潜力和挑战,解析其在移动设备领域的应用前景)

用PE装Win10系统教程(详细教您如何使用PE工具安装Windows10系统)

电脑自动关机教程(简单设置让电脑省心关机,提升使用体验)

Sonyi5笔记本电脑(一款高性能的笔记本电脑,轻松应对各类任务)

大疆飞行器的卓越性能与创新技术(引领无人机行业的先锋品牌)

以高清显卡畅玩游戏,尽享视觉盛宴(解析高清显卡的性能与优势,让游戏更加流畅逼真)

制作自己的原版Win7系统镜像(从零开始,轻松制作属于你的Win7系统)

友情链接

滇ICP备2023006006号-33