Python爬虫(三)Beautiful Soup 实战,爬取前程无忧网站

news/2024/5/10 2:18:57/文章来源:https://blog.csdn.net/lhxez6868/article/details/99649734

Beautiful Soup介绍

  • Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。
  • Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。
  • Beautiful Soup已成为和lxml、html5lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。

模块安装

pip install beautifulsoup4

模块引入

from bs4 import BeautifulSoup

解析html

1、通过requests请求url,获取到html内容;

2、用BeautifulSoup解析html内容,生成文档树;

3、用BeautifulSoup的方法遍历文档树;

#-*- coding: UTF-8 -*-
import requests
from bs4 import BeautifulSoupurl="https://www.baidu.com"
r=requests.get(url)
html = r.content.decode("utf-8")
# 或者用r.text
soup=BeautifulSoup(html,'html.parser')# 剩下的工作就是通过soup去获取需要的节点

soup=BeautifulSoup(html,'html.parser')
解析方式主要推荐使用:html.parser 或者 lxml

下面是常见解析器:

遍历文档树

1、使用.的方式按照层级查找

 soup.html.head.title         

  如果同一层级下有多个同名节点,只能返回第一个


2、使用函数方式

contents: 查找节点的直接子节点,但是换行也会被当成是一个节点。
children:返回一个可迭代对象,内容和contents相同
descendants:返回一个可迭代对象,返回所有的子孙节点,换行也会被当成是一个节点
parent:获取直接上级父节点

parents:获取所有的父节点
next_subling, previous_sibling:前后兄弟节点,只遍历同一级别的节点
next_element, previous_element:前后节点,会遍历子孙节点

搜索文档树


find_all( name , attrs , recursive , text , **kwargs )

遍历文档树匹配符合规则的所有的标签列表,返回list

1、find_all(Tag) 

Tag标签名查找,可以写字符串,可以写列表、正则。


soup.find_all("img")  # 传入字符串,找对应的标签
find_all(["h1","h2"])   #  列表方式,找多个标签类型
find_all(re.compile("h[1-6]"))    # 正则匹配

2、find_all(Tag,attrs={})

attrs属性查找。


find_all("div",attrs={"class":"txList"}) # 查找class属性包含txList的节点
find_all("div",attrs={"data-id":re.compile("\d")}) # 正则匹配,查找data-id的属性都是数字的标签

3、find_all(Tag,text="")

按照文本内容查找。

print(soup.find_all("a",text="新闻"))  # 文本内容是“新闻”的所有a标签
find_all(text="文本测试")[0].parent  # 没有带标签名,直接文本查找,默认是文本自己
find_all(text=re.compile('女'))  #正则,匹配文本中包含女的 文本

4、limit=num

限定匹配次数
find_all(text=re.compile('女'),limit=3) 只查找3次


5、find()  

只返回第一个结果,返回的是Tag
find("a",text="文本测试").parent    不需要[0]

 

结合节点操作

print(soup.find(id='head').div.div.next_sibling.next_sibling)  

 

可以通过节点函数获取父节点、兄弟节点、前后节点

find_parents() 找到所有的父节点

find_parent()  找到直接上级父节点

 

find_next_siblings()   找到所有后面的兄弟节点,只找同级节点,包括换行符

find_next_sibling()  找到下一个兄弟节点

find_previous_siblings()  找到所有前面的兄弟节点,只找同级节点,包括换行符

find_previous_sibling()  找到前面一个兄弟节点

 

find_all_next()  找到所有后面的节点,包括子孙节点

find_next() 找到下一个节点

find_all_previous() 找到所有前面的节点,包括子孙节点

find_previous() 找到前面一个节点

 

例子:如果下面列表中,第二个dt ,<dt>《圣墟》正文卷</dt>,后面所有的dd内容呢?

# 找到第二个dt的所有后面的兄弟节点
dd_tags = soup.find_all("dt")[1].find_next_siblings()

获取标签的属性和文本


1、取属性,attrs


# 获取标签对象的所有属性,返回一个字典dict
soup.find("h2").a.attrs

#-*- coding: UTF-8 -*-
import requests
from bs4 import BeautifulSoupurl="https://www.baidu.com"
r=requests.get(url)
html = r.content.decode("utf-8")
soup=BeautifulSoup(html,'html.parser')print(soup.find("input",attrs={"id":"su"}).attrs)# 打印结果
# {'value': '百度一下', 'class': ['bg', 's_btn'], 'autofocus': '', 'type': 'submit', 'id': 'su'}


# 获取标签对象的href属性
soup.find("h2").a.attrs["hef"]


2、获取文本 text string


text 可以获取标签的所有文本,包含子孙节点的文本
string 只能获取当前标签的文本,无内容返回None
soup.find("h2").a.text
soup.find("h2").a.string
soup.find("div",attrs={"class":"subnav-1"}).text

CSS选择器,select的使用

select() 使用css选择器查找标签,返回列表

.点好代表查找class

#代表查找ID


soup.select("div.txList") #div标签中,class是txList的标签列表
soup.select("div#1002") #div标签中,ID是1002的标签列表
soup.select("div[data-id]") #div标签中,带有data-id属性的标签列表
soup.select("div[data-id=45]") #div标签中,data-id属性是45的标签列表

 

当然,select也可以和find函数一起使用

soup.select("div#u1")[0].find_all("a",attrs={"name":"tj_trhao123"})

 

其他函数

prettify() 格式美化代码输出

print(soup.prettify())# 或者带formatter参数指定格式输出
print(soup.prettify(formatter="html"))

 

练习题:

爬取前程无忧的招聘职位信息。包括的信息有 职位名,职位url,公司名,工作地址,薪资,发布时间,保存到csv文件中。

看下html的结构,各个信息的位置:

 上手,直接贴代码

#-*- coding: UTF-8 -*-
import requests,time
from bs4 import BeautifulSoupdef get_jobs(keyword,page):'''爬取前程无忧上海地区的招聘信息,结果保存到csv文件中keyword:职位搜索关键字page:搜索多少页,到末尾了会自动停止'''headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36","Referer":"https://search.51job.com/list/020000,000000,0000,00,9,99,python%25E5%25BC%2580%25E5%258F%2591,2,10.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare="}current_page=1# 保存的文件名称filename = keyword+",薪资" + str(int(time.time())) + ".csv"while current_page<=page:url = "https://search.51job.com/list/020000,000000,0000,00,9,99," + keyword + ",2," + str(current_page) + ".html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare="r=requests.get(url,headers=headers)html = r.content.decode("gbk")soup=BeautifulSoup(html,"html.parser")div_tags=soup.find("div",attrs={"id":"resultList"}).find_all("div",attrs={"class":"el"})[1:]with open(filename,"a",encoding="utf-8") as file:for once in div_tags:name = once.p.span.a.text.strip()url = once.p.span.a.attrs["href"]company = once.find("span",attrs={"class":"t2"}).a.textaddress = once.find("span",attrs={"class":"t3"}).textsal = once.find("span",attrs={"class":"t4"}).textif sal=='':sal="薪资面议"release_time = once.find("span",attrs={"class":"t5"}).text# print(name,url,company,address,sal,release_time)file.write("%s,%s,%s,%s,%s,%s\n"%(name,company,address,sal,release_time,url))print("第%d页爬取完成"%(current_page))current_page = current_page + 1# 判断是否到最后一页了next_page = soup.find("a",text="下一页")if next_page==None:print("已经爬取到最后一页了")breakget_jobs("机器学习",50)

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_764059.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET MVC5 网站开发实践 - 概述

原文地址为&#xff1a; ASP.NET MVC5 网站开发实践 - 概述前段时间一直在用MVC4写个网站开发的demo&#xff0c;由于刚开始学所有的代码都写在一个项目中&#xff0c;越写越混乱&#xff0c;到后来有些代码自己都理不清了。1月26日晚上在群里跟怒放 他们讨论这个问题&#xff…

SQL学习总结以及学习网站

在寒假期间&#xff0c;也趁着大学最后一段美好的学习时间&#xff0c;来了解MSSQL&#xff0c;Oracle&#xff0c;MySQL等热门的的数据库开发语言&#xff0c;感觉很美妙&#xff08;目前的基础操作部分&#xff0c;挺容易上手的&#xff09; 首先在开始接触SQL Server 时&am…

拜访Go语言中文网站长

大家好&#xff0c;我是飞哥&#xff01;过去的这一年多里&#xff0c;我除了工作以外的主要精力大都放在写公众号里的技术文上了。 不过随着公众号的进步&#xff0c;越来越意识到不应该只顾低头写文章&#xff0c;而是应该抬头看看优秀的人都在做啥。说来也巧&#xff0c;互联…

ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(2)用户登录、注销

原文地址为&#xff1a; ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分&#xff08;2&#xff09;用户登录、注销上次实现了用户注册&#xff0c;这次来实现用户登录&#xff0c;用到IAuthenticationManager的SignOut、SignIn方法和基于声明的标识。最后修改用户注册代…

学用MVC4做网站一:用户登陆1.2

原文地址为&#xff1a; 学用MVC4做网站一:用户登陆1.2一用户 1.1用户注册 1.2用户登陆 首先在Models里添加用户登陆模型类UserLogin&#xff0c;该类只要用用户名&#xff0c;密码和验证码三个字段。 /// <summary>/// 用户登陆模型/// </summary>public class…

提升你网站水平的 jQuery 插件推荐

原文地址为&#xff1a; 提升你网站水平的 jQuery 插件推荐jQuery是一个优秀JavaScript库&#xff0c;它简化了HTML文档遍历&#xff0c;事件处理&#xff0c;动画和Ajax交互。 jQuery的确改变了很多人写JavaScript的方式。如今&#xff0c;有很多现成的jQuery插件可供选择&…

使用C#实现网站用户登录

原文地址为&#xff1a; 使用C#实现网站用户登录我们在写灌水机器人、抓资源机器人和Web网游辅助工具的时候第一步要实现的就是用户登录。那么怎么用C#来模拟一个用户的登录拉&#xff1f;要实现用户的登录&#xff0c;那么首先就必须要了解一般网站中是怎么判断用户是否登录的…

轻量服务器如何退款_wordpress程序搭建网站教程,新手小白如何搭建个人博客?...

导读&#xff1a;最近很多同学在问wordpress搭建教程因为很多的人都不会操作&#xff0c;只有学习过老课程的同学才知道&#xff0c;那么我就出一个详细的教程。(文/王听风)一.购买服务器这里我就以阿里云为列子&#xff1a;1.打开网址(https://www.aliyun.com/product/ecs)云服…

python面试题网站有哪些_扣丁学堂解析Python爬虫工程师面试题汇总

扣丁学堂解析Python爬虫工程师面试题汇总 2018-08-20 11:24:39 1664浏览 今天&#xff0c;扣丁学堂的小编来给大家总结一下Python爬虫的面试技巧&#xff0c;希望给参加Python培训的同学一点儿帮助。1、对__if__name__main的理解陈述 __name__是当前模块名&#xff0c;当模块被…

火狐(Firefox)如何移除add security exception添加的网站

如图&#xff0c;我浏览某些网站时弹出来如下框&#xff0c;为了浏览网页&#xff0c;我点了add exception—confirm security exception。现在我想移除&#xff0c;该如何操作&#xff1f; About Me ..................................................................…

web应用程序和web网站_使用推荐引擎个性化您的Web应用程序

web应用程序和web网站为了在快速发展的全球行业中保持相关性&#xff0c;技术专业人员必须跟踪IT的重大趋势&#xff0c;并找到方法将重要的趋势纳入其公司的技术产品组合中。 这样的趋势之一就是使用推荐引擎来驱动用户探索您的网站或企业的其他产品。 这些引擎根据各种模式向…

推荐16个国外的源码下载网站

本文转载自&#xff1a; https://www.cnblogs.com/lhb25/archive/2011/04/20/2013129.html 作者&#xff1a;lhb25 转载请注明该声明。如今&#xff0c;网上有很多的源代码下载网站&#xff0c;分析和学习别人的代码也是提高自己编程能力的方法之一。今天本文向大家推荐16个国…

网站建设过程中的:重要页面、关键页面、过程页面、结果页面

网站的页面类型和等级可做归类。 有些是“重要页面”&#xff0c;有些是“关键页面”&#xff0c;有些是“过程页面”&#xff0c;有些是“结果页面”。 这些根据页面存在的目的和作用分门别类。 “重要页面”和“关键页面”等级高于“过程页面”和“结果页面” 用户行为分析这…

大型网站服务器架构

QQ游戏于前几日终于突破了百万人同时在线的关口&#xff0c;向着更为远大的目标迈进&#xff0c;这让其它众多传统的棋牌休闲游戏平台黯然失色&#xff0c;相比之下&#xff0c;联众似乎已经根本不是QQ的对手&#xff0c;因为QQ除了这100万的游戏在线人数外&#xff0c;它还拥有…

大型网站系统架构分析

千万级的注册用户&#xff0c;千万级的帖子&#xff0c;nTB级的附件&#xff0c;还有巨大的日访问量&#xff0c;大型网站采用什么系统架构保证性能和稳定性&#xff1f; 首先讨论一下大型网站需要注意和考虑的问题。 数据库海量数据处理&#xff1a;负载量不大的情况下selec…

(转)网站加速--动态应用篇 (上)

--提升性能的同时为你节约10倍以上成本From: http://blog.sina.com.cn/iyangjian一, 引子二&#xff0c;总体结构图三&#xff0c;系统结构综述四&#xff0c;环境配置以及底层基础类库五, Memcache & Mysql 常用场景案例六&#xff0c;更多待续 ......-------------------…

宝塔如何备份网站_如何使用宝塔面板创建定时任务?

大家在使用宝塔面板时都可能会遇到需要使用定时任务的功能,在其进行操作网站程式时,例如文件备份、木马查杀&#xff0c;释放内存等都会用到定时任务&#xff0c;而用好定时任务功能可以使你工作效率事半功倍。而今天要教给大家的就是如何在SugarHosts云服务器上使用宝塔面板创…

网站 服务器 和 空间大小,网站服务器和空间大小

网站服务器和空间大小 内容精选换一换问题现象下载云主机文件到主机网盘&#xff0c;即下载文件到用户个人主机网盘时&#xff0c;提示下载失败错误。上传文件失败&#xff0c;提示/3.0/h5FileService/upload-403&#xff1a;服务错误&#xff0c;请稍后重试。从本地上传文件到…

寻找网页设计灵感的27个最佳网站推荐

今天&#xff0c;本文要向大家推荐的是27个寻找网页设计灵感的最佳网站。设计师们可通过这些网站收集的优秀网页设计作品来获取灵感&#xff0c;进而设计出更加时尚、更有创意的作品。如果你有收藏这个列表中遗漏的网站&#xff0c;欢迎在评论中与大家分享。 CSS Nature Design…

linux创建ftp挂载硬盘,FTP架设 - 用Ubuntu Server架设基于独立硬盘的Windows文件共享和FTP服务器_服务器应用_Linux公社-Linux系统门户网站...

之前将storage文件夹(背后是挂载的整块新硬盘)通过samba服务与Windows共享。之所以先共享&#xff0c;是为了完成FTP后方便文件管理。软件&#xff1a;vsftpd目标&#xff1a;让用户登录FTP后可以上传文件(主要用于iPhone照片备份)&#xff0c;不同用户备份在各自的文件夹下。W…