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 ...
随机推荐
- NET设计模式 第二部分 结构性模式(10):组合模式(Composite Pattern)
组合模式(Composite Pattern) ——.NET设计模式系列之十一 Terrylee,2006年3月 概述 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复 ...
- idea下的调试配置
react和ts的整合 https://github.com/Microsoft/TypeScript-React-Starter vue的 https://github.com/ducksoupde ...
- dubbo-admin在jdk8下不兼容
参考这里 修改pom.xml webx的依赖改为3..6版 <dependency> <groupId>com.alibaba.citrus</groupId> & ...
- Comparator 排序 ArrayList 实操练习
package ltb6w; import java.util.Scanner;import java.util.ArrayList;import java.util.Comparator;impor ...
- sqlserver 查询表中的主键、外键列及外键表,外表中的主键列
1.获取主键信息 EXEC sp_pkeys @table_name='{0}' 2.获取外键 方法二 SELECT Field=(SELECT name FROM syscolumns WHERE ...
- STL基础--算法(修改数据的算法)
修改元素的算法 copy, move, transform, swap, fill, replace, remove vector<int> vec = {9,60,70,8,45,87, ...
- 【剑指offer】调整数组数字位置
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. *思路:遍历数组,找到第一个偶 ...
- vue-router总结
之前写过一篇关于vue-router的文章,主要是介绍怎么结合cli2在项目中使用vue-router,比较的简单,今天想结合cli3来总结一下vue-router的具体用法. cli3 在介绍vue ...
- [转][C#][WebApi]
在 WebApi 中获取网页在服务器上的位置可以使用以下两种方式: string filePath = HostingEnvironment.MapPath(string.Format("/ ...
- HTML和SEO基础知识:H标签全透视
原文地址:http://www.chinaz.com/web/2010/0921/134391.shtml 什么是H标签? h1,h2,h3,h4,h5,h6,作为标题标签,并且依据重要性递减.我认为 ...