四种Python爬虫常用的定位元素方法对比,你偏爱哪一款?
作者:陈熹
来源:早起Python
在使用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 requestsurl = '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")
将文本转换为特定规范的结构,利用 find
系列方法进行解析,代码如下:
import requests
from bs4 import BeautifulSoupurl = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
response = requests.get(url).textdef 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个lifor 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 BeautifulSoupurl = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
response = requests.get(url).textdef 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 htmlurl = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
response = requests.get(url).textdef 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 htmlurl = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
response = requests.get(url).textdef 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 reurl = '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 reurl = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
response = requests.get(url).textdef 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 reurl = 'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'
response = requests.get(url).textdef 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)
近期开课信息
四种Python爬虫常用的定位元素方法对比,你偏爱哪一款?相关推荐
- 盘点3种Python爬虫 中文乱码 的处理方法
人生苦短,快学Python! 给大家祭出网络爬虫过程中三种中文乱码的处理方案,希望对大家的学习有所帮助. 前言 前几天有个粉丝在Python交流群里问了一道关于使用Python网络爬虫过程中中文乱码的 ...
- 对比四种爬虫定位元素方法,你更爱哪个?
作者 | 陈熹 来源 | 早起Python 头图 | 下载于视觉中国 在使用Python本爬虫采集数据时,一个很重要的操作就是如何从请求到的网页中提取数据,而正确定位想要的数据又是第一步操作.本文将对 ...
- python网页元素定位_用Selenium进行网页元素定位以及常用的定位元素的方法
用Selenium进行网页元素定位 一.前提条件: 下载.安装Selenium 二.编写定位网页元素的脚本(这里以定位百度网页的元素举例) 1.新建文本文档(可以用任意的文本编辑器,我这里用的是Pyc ...
- python爬虫详细步骤-Python爬虫的两套解析方法和四种爬虫实现过程
对于大多数朋友而言,爬虫绝对是学习 python 的最好的起手和入门方式.因为爬虫思维模式固定,编程模式也相对简单,一般在细节处理上积累一些经验都可以成功入门.本文想针对某一网页对 python 基础 ...
- python主要就业方向-四种Python高薪就业方向
前言: Python使用范围很广泛,一个人精力有限,不可能精通所有的领域.就拿Python官网的Python应用领域来说,Python有以下几个方面的应用: Web Programming:Djang ...
- 数据采集与清洗基础习题(二)Python爬虫常用模块,头歌参考答案
数据采集习题参考答案,会持续更新,点个关注防丢失.为了方便查找,已按照头歌重新排版,朋友们按照头歌所属门类查找实训哦,该篇为Python爬虫常用模块. 创作不易,一键三连给博主一个支持呗. 文章目录 ...
- python爬虫常用流程_爬虫采集基本流程,python爬虫框架排行榜
爬虫其实是通过伪装数据,借用代理IP工具,并模仿用户行为实现采集信息,这爬虫采集基本流程是怎样的呢?爬虫的框架影响采集的效果,在编写爬虫之前,选择怎么样的爬虫框架好? 今天就跟智连代理小编去看看pyt ...
- python selenium定位元素方法_[原创] python selenium 元素定位方法封装
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 写好了公用的调用类,接下来就按照pageobject的设计模式写一下基本的元素定位方法,此处我们需要对python的方法传参有所了解,没有自信的同学可以返 ...
- Python爬虫常用的爬虫注意事项及技巧
Python爬虫常用的爬虫技巧 1.基本抓取网页 2.使用代理IP 3.Cookies处理 4.伪装成浏览器 5.页面解析 6.验证码的处理 7.gzip压缩 8.多线程并发抓取 urllib库为例进 ...
最新文章
- 【Codeforces】659B Qualifying Contest (sort)
- python的socket编程_Python Socket编程详细介绍
- 腾讯优图开源首个医疗AI ML预训练模型
- 如何合并多个Django项目?
- android启用其他应用程序,杀死Android上的另一个应用程序?
- u9系统的使用方法仓库_HPE产品认证证书查询系统使用方法
- 计算机用于数据管理经历了,管理系统中计算机应用--期中测验答案
- DotNetNuke模块开发简介
- python requests返回值为200 但是text无内容_接口测试入门神器 - Requests
- 我的敏捷生活(1)--where am I
- 【网络安全工程师面试合集】安全角度谈UDP、TCP和DHCP协议
- Javascript设计模式之单例模式
- Java编程常用的软件有哪些
- php doc生成pdf文件怎么打开乱码,phpexcel 导出pdf文件乱码,该如何解决
- Redis03-优惠券秒杀
- 小鼠大脑解剖图分区_科学家们绘制小鼠大脑的详细3D结构图谱
- 如何用c语言串口通讯,串口通信入门
- (Python)从零开始,简单快速学机器仿人视觉Opencv---运用二:物体检测
- 易语言源码 VX多开 思路+源码
- InteliJ IDEA2018.2.1X64 破解 使用
热门文章
- js文件大小转换成mb、kb为单位
- STM32: IWDG独立看门狗
- 商业保理,一种新型的物流行业融资模式
- 【MSP430G2553】图形化开发笔记(2) 系统时钟和低功耗模式
- WebStorm 链接外部库 External Libraries 添加本地js库
- 张飞老师硬件第二十四部--马达驱动--原理图设计①----5三项直流无刷永磁电机相关
- 独立开发变现周刊(第22期):回复消息来辨别鞋子真假,年收入20万美金?
- 计算机大赛颁奖大会,我院举行首届计算机操作员大赛颁奖大会
- android fence机制,Android中的GraphicBuffer同步機制-Fence
- 狐火浏览器禁用JavaScript方法