来源:早起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).textprint(response)
文章插图
仔细检查后发现需要的数据都在返回内容中,说明不需要特别考虑反爬举措
审查网页元素后可以发现,书目信息都包含在 li 中,从属于 class 为 bang_list clearfix bang_list_mode 的 ul 中
文章插图
进一步审查也可以发现书名在的相应位置,这是多种解析方法的重要基础
文章插图
1. 传统 BeautifulSoup 操作经典的 BeautifulSoup 方法借助 from bs4 import BeautifulSoup,然后通过 soup = BeautifulSoup(html, "lxml") 将文本转换为特定规范的结构,利用 find 系列方法进行解析,代码如下:
import requestsfrom 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个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 requestsfrom bs4 import BeautifulSoupurl = '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 requestsfrom bs4 import BeautifulSoupfrom lxml import htmlurl = '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)
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Pyppeteer爬虫神器详解
- 破了这几种爬虫加密算法后,我的路更近了「JS逆向3」
- python的5种数据结构,方法很多记不住吗?全在这里了.
- 500行代码,教你用python写个微信飞机大战
- 六堡茶制造方法,六堡茶的四种实用冲泡方法
- 初窥 Python 的 import 机制
- Python网络编程实现自动化,简化Telnet网络配置工作
- 2分钟将Python转换为exe
- 5分钟看懂Python之Excel文件操作
- 白发尖的油炸方法,通天岩茶泡茶的四种工艺