etree和Beautiful Soup的使用
1.lxml 是一种使用 Python 编写的库,可以迅速、灵活地处理 XML ,支持 XPath (XML Path Language),使用 lxml 的 etree 库来进行爬取网站信息
2.Beautiful Soup支持从HTML或XML文件中提取数据的Python库;支持Python标准库中的HTML解析器;还支持一些第三方的解析器lxml, 使用的是 Xpath 语法
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。
我们爬取腾讯招聘网站的链接为https://hr.tencent.com/position.php?&start=10#a
需要获取职位名称、职位类别、招聘人数、工作地点、发布时间等信息
一、使用etree爬取信息
1.导入库
from lxml import etree
from urllib import request#进一步了解urllib和requests的区别
import json
在python.3中使用urllib库中的request模块,保存输出为json文件
2.获取网站并写到json文件中
response=request.urlopen('https://hr.tencent.com/position.php?&start=10#a')#获取网站链接
resHtml=response.read()
output=open('tencent1.json','wb+')#使用二进制方式打开,写入到json文件
如果只使用w来写入文件会报错:
write() argument must be str, not bytes
我们需要用二进制来打开改为wb+
3.获取我们需要得到的标签

html=etree.HTML(resHtml)
result=html.xpath('//tr[@class="odd"] | //tr[@class="even"]')#获取tr标签下的所有class只有odd和even,用|并列
for site in result:
item={ }
必须是字典形式,先定义一个空字典
name=site.xpath('./td[1]/a')[0].text
detailLink=site.xpath('./td[1]/a')[0].attrib['href']
catalog=site.xpath('./td[2]')[0].text
recruitNumber=site.xpath('./td[3]')[0].text
workLocation=site.xpath('./td[4]')[0].text
publishTime=site.xpath('./td[5]')[0].text
找到我们需要的字段
4.规范输出形式
print(type(name))
print(name,detailLink,catalog,recruitNumber,workLocation,publishTime)
item['name']=name
item['detailLink']=detailLink
item['catalog']=catalog
item['recruitNumber']=recruitNumber
item['publishTime']=publishTime line = json.dumps(item,ensure_ascii=False) + '\n'
print(line)
output.write(line.encode('utf-8'))#编码格式 output.close()
运行后结果如下:
<class 'str'>
23677-互娱服务采购经理 position_detail.php?id=44802&keywords=&tid=0&lid=0 职能类 1 深圳 2018-10-16
{"catalog": "职能类", "name": "23677-互娱服务采购经理", "recruitNumber": "1", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44802&keywords=&tid=0&lid=0"} <class 'str'>
22989-腾讯云块存储底层开发工程师(深圳) position_detail.php?id=44803&keywords=&tid=0&lid=0 技术类 2 深圳 2018-10-16
{"catalog": "技术类", "name": "22989-腾讯云块存储底层开发工程师(深圳)", "recruitNumber": "2", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44803&keywords=&tid=0&lid=0"} <class 'str'>
24549-渠道管理经理(政策管理方向-上海) position_detail.php?id=44804&keywords=&tid=0&lid=0 市场类 1 上海 2018-10-16
{"catalog": "市场类", "name": "24549-渠道管理经理(政策管理方向-上海)", "recruitNumber": "1", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44804&keywords=&tid=0&lid=0"} <class 'str'>
24549-渠道管理经理(ROC管理方向-上海) position_detail.php?id=44805&keywords=&tid=0&lid=0 市场类 1 上海 2018-10-16
{"catalog": "市场类", "name": "24549-渠道管理经理(ROC管理方向-上海)", "recruitNumber": "1", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44805&keywords=&tid=0&lid=0"} <class 'str'>
24549-广告营销业务分析师(上海) position_detail.php?id=44806&keywords=&tid=0&lid=0 市场类 1 上海 2018-10-16
{"catalog": "市场类", "name": "24549-广告营销业务分析师(上海)", "recruitNumber": "1", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44806&keywords=&tid=0&lid=0"} <class 'str'>
28297-RPG手游—市场和平台渠道推广(深圳) position_detail.php?id=44809&keywords=&tid=0&lid=0 产品/项目类 1 深圳 2018-10-16
{"catalog": "产品/项目类", "name": "28297-RPG手游—市场和平台渠道推广(深圳)", "recruitNumber": "1", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44809&keywords=&tid=0&lid=0"} <class 'str'>
21309-在线教育-运营视觉设计师(深圳) position_detail.php?id=44800&keywords=&tid=0&lid=0 设计类 2 深圳 2018-10-16
{"catalog": "设计类", "name": "21309-在线教育-运营视觉设计师(深圳)", "recruitNumber": "2", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44800&keywords=&tid=0&lid=0"} <class 'str'>
21309-在线教育-UI设计师(深圳) position_detail.php?id=44801&keywords=&tid=0&lid=0 设计类 2 深圳 2018-10-16
{"catalog": "设计类", "name": "21309-在线教育-UI设计师(深圳)", "recruitNumber": "2", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44801&keywords=&tid=0&lid=0"} <class 'str'>
22989-数据库高级产品运营经理 position_detail.php?id=44795&keywords=&tid=0&lid=0 产品/项目类 1 北京 2018-10-16
{"catalog": "产品/项目类", "name": "22989-数据库高级产品运营经理", "recruitNumber": "1", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44795&keywords=&tid=0&lid=0"} <class 'str'>
27087-海外区域中心空间运营经理(深圳) position_detail.php?id=44797&keywords=&tid=0&lid=0 市场类 1 深圳 2018-10-16
{"catalog": "市场类", "name": "27087-海外区域中心空间运营经理(深圳)", "recruitNumber": "1", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44797&keywords=&tid=0&lid=0"}
导出的json文件如下:
{"catalog": "职能类", "name": "23677-互娱服务采购经理", "recruitNumber": "1", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44802&keywords=&tid=0&lid=0"}
{"catalog": "技术类", "name": "22989-腾讯云块存储底层开发工程师(深圳)", "recruitNumber": "2", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44803&keywords=&tid=0&lid=0"}
{"catalog": "市场类", "name": "24549-渠道管理经理(政策管理方向-上海)", "recruitNumber": "1", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44804&keywords=&tid=0&lid=0"}
{"catalog": "市场类", "name": "24549-渠道管理经理(ROC管理方向-上海)", "recruitNumber": "1", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44805&keywords=&tid=0&lid=0"}
{"catalog": "市场类", "name": "24549-广告营销业务分析师(上海)", "recruitNumber": "1", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44806&keywords=&tid=0&lid=0"}
{"catalog": "产品/项目类", "name": "28297-RPG手游—市场和平台渠道推广(深圳)", "recruitNumber": "1", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44809&keywords=&tid=0&lid=0"}
{"catalog": "设计类", "name": "21309-在线教育-运营视觉设计师(深圳)", "recruitNumber": "2", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44800&keywords=&tid=0&lid=0"}
{"catalog": "设计类", "name": "21309-在线教育-UI设计师(深圳)", "recruitNumber": "2", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44801&keywords=&tid=0&lid=0"}
{"catalog": "产品/项目类", "name": "22989-数据库高级产品运营经理", "recruitNumber": "1", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44795&keywords=&tid=0&lid=0"}
{"catalog": "市场类", "name": "27087-海外区域中心空间运营经理(深圳)", "recruitNumber": "1", "publishTime": "2018-10-16", "detailLink": "position_detail.php?id=44797&keywords=&tid=0&lid=0"}
二、使用Beautiful Soup爬取信息
1.导入库
from bs4 import BeautifulSoup from urllib import request import json
2.获取网站并写到json文件中
response=request.urlopen('https://hr.tencent.com/position.php?&start=10#a')
resHtml=response.read()
output=open('tencent2.json','wb+')
3.获取我们需要得到的标签
html = BeautifulSoup(resHtml,'lxml')
result = html.select('tr[class="even"]')
result2= html.select('tr[class="odd"]')
result+=result2
print(len(result)) for site in result:
item = {} name = site.select('td a')[0].get_text()
detailLink = site.select('td a')[0].attrs['href']#Tag就是 HTML 中的一个个标签,它的两个属性是name和attrs
catalog = site.select('td ')[1].get_text()
recruitNumber = site.select('td ')[2].get_text()
workLocation = site.select('td ')[3].get_text()
publishTime = site.select('td ')[4].get_text()
4.规范输出形式
item['name']=name
item['detailLink'] = detailLink
item['catalog'] = catalog
item['recruitNumber'] = recruitNumber
item['workLocation'] = workLocation
item['publishTime'] = publishTime line = json.dumps(item,ensure_ascii=False)
print(line) output.write(line.encode('utf-8')) output.close()
运行结果如下:
10
{"detailLink": "position_detail.php?id=44802&keywords=&tid=0&lid=0", "catalog": "职能类", "publishTime": "2018-10-16", "recruitNumber": "1", "name": "23677-互娱服务采购经理", "workLocation": "深圳"}
{"detailLink": "position_detail.php?id=44804&keywords=&tid=0&lid=0", "catalog": "市场类", "publishTime": "2018-10-16", "recruitNumber": "1", "name": "24549-渠道管理经理(政策管理方向-上海)", "workLocation": "上海"}
{"detailLink": "position_detail.php?id=44806&keywords=&tid=0&lid=0", "catalog": "市场类", "publishTime": "2018-10-16", "recruitNumber": "1", "name": "24549-广告营销业务分析师(上海)", "workLocation": "上海"}
{"detailLink": "position_detail.php?id=44800&keywords=&tid=0&lid=0", "catalog": "设计类", "publishTime": "2018-10-16", "recruitNumber": "2", "name": "21309-在线教育-运营视觉设计师(深圳)", "workLocation": "深圳"}
{"detailLink": "position_detail.php?id=44795&keywords=&tid=0&lid=0", "catalog": "产品/项目类", "publishTime": "2018-10-16", "recruitNumber": "1", "name": "22989-数据库高级产品运营经理", "workLocation": "北京"}
{"detailLink": "position_detail.php?id=44803&keywords=&tid=0&lid=0", "catalog": "技术类", "publishTime": "2018-10-16", "recruitNumber": "2", "name": "22989-腾讯云块存储底层开发工程师(深圳)", "workLocation": "深圳"}
{"detailLink": "position_detail.php?id=44805&keywords=&tid=0&lid=0", "catalog": "市场类", "publishTime": "2018-10-16", "recruitNumber": "1", "name": "24549-渠道管理经理(ROC管理方向-上海)", "workLocation": "上海"}
{"detailLink": "position_detail.php?id=44809&keywords=&tid=0&lid=0", "catalog": "产品/项目类", "publishTime": "2018-10-16", "recruitNumber": "1", "name": "28297-RPG手游—市场和平台渠道推广(深圳)", "workLocation": "深圳"}
{"detailLink": "position_detail.php?id=44801&keywords=&tid=0&lid=0", "catalog": "设计类", "publishTime": "2018-10-16", "recruitNumber": "2", "name": "21309-在线教育-UI设计师(深圳)", "workLocation": "深圳"}
{"detailLink": "position_detail.php?id=44797&keywords=&tid=0&lid=0", "catalog": "市场类", "publishTime": "2018-10-16", "recruitNumber": "1", "name": "27087-海外区域中心空间运营经理(深圳)", "workLocation": "深圳"}
以上为两种方法爬取网站信息,个人觉得用Beautiful Soup爬取比较方便
etree和Beautiful Soup的使用的更多相关文章
- python标准库Beautiful Soup与MongoDb爬喜马拉雅电台的总结
Beautiful Soup标准库是一个可以从HTML/XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式,Beautiful Soup将会节省数小 ...
- (最全)Xpath、Beautiful Soup、Pyquery三种解析库解析html 功能概括
一.Xpath 解析 xpath:是一种在XMl.html文档中查找信息的语言,利用了lxml库对HTML解析获取数据. Xpath常用规则: nodename :选取此节点的所有子节点 // : ...
- ubuntu下的python网页解析库的安装——lxml, Beautiful Soup, pyquery, tesserocr
lxml 的安装(xpath) pip3 install lxml 可能会缺少以下依赖: sudo apt-get install -y python3-dev build-e ssential li ...
- 使用Beautiful Soup编写一个爬虫 系列随笔汇总
这几篇博文只是为了记录学习Beautiful Soup的过程,不仅方便自己以后查看,也许能帮到同样在学习这个技术的朋友.通过学习Beautiful Soup基础知识 完成了一个简单的爬虫服务:从all ...
- 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(1): 基础知识Beautiful Soup
开始学习网络数据挖掘方面的知识,首先从Beautiful Soup入手(Beautiful Soup是一个Python库,功能是从HTML和XML中解析数据),打算以三篇博文纪录学习Beautiful ...
- Python爬虫学习(11):Beautiful Soup的使用
之前我们从网页中提取重要信息主要是通过自己编写正则表达式完成的,但是如果你觉得正则表达式很好写的话,那你估计不是地球人了,而且很容易出问题.下边要介绍的Beautiful Soup就可以帮你简化这些操 ...
- 推荐一些python Beautiful Soup学习网址
前言:这几天忙着写分析报告,实在没精力去研究django,虽然抽时间去看了几遍中文文档,还是等实际实践后写几篇操作文章吧! 正文:以下是本人前段时间学习bs4库找的一些网址,在学习的可以参考下,有点多 ...
- 错误 You are trying to run the Python 2 version of Beautiful Soup under Python 3. This will not work
Win 10 下python3.6 使用Beautiful Soup 4错误 You are trying to run the Python 2 version of Beautiful ...
- Python学习笔记之Beautiful Soup
如何在Python3.x中使用Beautiful Soup 1.BeautifulSoup中文文档:http://www.crummy.com/software/BeautifulSoup/bs3/d ...
随机推荐
- py-day2-2 python 元祖
#元祖 tuple v = 'abddbwdhi' b = tuple(v) print(b) ('a', 'b', 'd', 'd', 'b', 'w', 'd', 'h', 'i') # 元素不可 ...
- 负载均衡器 Ribbion
一.客户端负载均衡器 Ribbon 客户端向服务器如Eureka Server拉取已经注册的服务信息,然后根据负载均衡策略, 直接命中哪一台服务器发送请求. 整个过程在客户端完成,不需要服务器的参与. ...
- Golang 端口复用测试
先给出结论: 同一个进程,使用一个端口,然后连接关闭,大约需要30s后才可再次使用这个端口. 测试 首先使用端口9001连接服务端,发送数据,然后关闭连接,接着再次使用端口9001连接服务端,如果连接 ...
- MySQL Master High Available 源码篇
https://m.aliyun.com/yunqi/users/1287368569594542/articles https://yq.aliyun.com/articles/59233 MySQ ...
- console call的fallback console 兼容
(function() { var noop = function noop() {}; var methods = [ 'assert', 'clear', 'count', 'debug', 'd ...
- 关于RabbitMQ分布式集群架构
RabbitMQ分布式集群架构和高可用性(HA) (一) 功能和原理 设计集群的目的 允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行 通过增加更多的节点来扩展消息通信的吞吐量 1 集群配 ...
- STL进阶--删除元素
删除元素 从vector或deque删除元素 vector<int> vec = {1, 4, 1, 1, 1, 12, 18, 16}; // 删除所有的1 for (vector< ...
- bzoj5045: 打砖块
Description 小Q最近沉迷于一款新型<打砖块>游戏.在每局游戏中,呈现在屏幕上的是一堵无限大小的墙壁.墙壁上镶嵌着 无数长度为2.宽度为1的砖块.墙壁被分成若干行,每行宽度都为1 ...
- C#对Mongodb数组对象操作
Mongo对数据的存储非常随意,需要修改对象中的数组对象时,就会变得比较复杂. 类中的类对象可以直接通过“.”例如:Department.User.name 类中的对象User是数组时可以用Depar ...
- Web jsp开发学习——点击菜单页面切换
两个网页使用同一个head,在点击“首页”后,head的“首页”变成绿色,点击“新闻”后,head的“新闻”变成绿色,head的“首页”恢复原来的颜色 head.jsp <%@ page ...