Python爬虫beautifulsoup4常用的解析方法总结


Posted in Python onFebruary 25, 2019

摘要

  • 如何用beautifulsoup4解析各种情况的网页

beautifulsoup4的使用

关于beautifulsoup4,官网已经讲的很详细了,我这里就把一些常用的解析方法做个总结,方便查阅。

装载html文档

使用beautifulsoup的第一步是把html文档装载到beautifulsoup中,使其形成一个beautifulsoup对象。

import requests
from bs4 import BeautifulSoup
url = "http://new.qq.com/omn/20180705/20180705A0920X.html"
r = requests.get(url)
htmls = r.text
#print(htmls)
soup = BeautifulSoup(htmls, 'html.parser')

初始化BeautifulSoup类时,需要加入两个参数,第一个参数即是我们爬到html源码,第二个参数是html解析器,常用的有三个解析器,分别是”html.parser”,”lxml”,”html5lib”,官网推荐用lxml,因为效率高,当然需要pip install lxml一下。

当然这三种解析方式在某些情况解析得到的对象内容是不同的,比如对于标签不完整这一情况(p标签只有一半):

soup = BeautifulSoup("<a></p>", "html.parser")
# 只有起始标签的会自动补全,只有结束标签的灰自动忽略
# 结果为:<a></a>
soup = BeautifulSoup("<a></p>", "lxml")
#结果为:<html><body><a></a></body></html>
soup = BeautifulSoup("<a></p>", "html5lib")
# html5lib则出现一般的标签都会自动补全
# 结果为:<html><head></head><body><a><p></p></a></body></html>

使用

在使用中,我尽量按照我使用的频率介绍,毕竟为了查阅~

  • 按照标签名称、id、class等信息获取某个标签
html = '<p class="title" id="p1"><b>The Dormouses story</b></p>'
soup = BeautifulSoup(html, 'lxml')
#根据class的名称获取p标签内的所有内容
soup.find(class_="title")
#或者
soup.find("p",class_="title" id = "p1")
#获取class为title的p标签的文本内容"The Dormouse's story"
soup.find(class_="title").get_text()
#获取文本内容时可以指定不同标签之间的分隔符,也可以选择是否去掉前后的空白。
soup = BeautifulSoup('<p class="title" id="p1"><b> The Dormouses story </b></p><p class="title" id="p1"><b>The Dormouses story</b></p>', "html5lib")
soup.find(class_="title").get_text("|", strip=True)
#结果为:The Dormouses story|The Dormouses story
#获取class为title的p标签的id
soup.find(class_="title").get("id")
#对class名称正则:
soup.find_all(class_=re.compile("tit"))
#recursive参数,recursive=False时,只find当前标签的第一级子标签的数据
soup = BeautifulSoup('<html><head><title>abc','lxml')
soup.html.find_all("title", recursive=False)
  • 按照标签名称、id、class等信息获取多个标签
soup = BeautifulSoup('<p class="title" id="p1"><b> The like story </b></p><p class="title" id="p1"><b>The Dormouses story</b></p>', "html5lib")
#获取所有class为title的标签
for i in soup.find_all(class_="title"):
  print(i.get_text())
#获取特定数量的class为title的标签
for i in soup.find_all(class_="title",limit = 2):
  print(i.get_text())
  • 按照标签的其他属性获取某个标签
html = '<a alog-action="qb-ask-uname" href="/usercent" rel="external nofollow" target="_blank">蜗牛宋</a>'
soup = BeautifulSoup(html, 'lxml')
# 获取"蜗牛宋",此时,该标签里既没有class也没有id,需要根据其属性来定义获取规则
author = soup.find('a',{"alog-action":"qb-ask-uname"}).get_text()
#或
author = soup.find(attrs={"alog-action": "qb-ask-uname"})
  • 找前头和后头的标签
soup.find_all_previous("p")
soup.find_previous("p")
soup.find_all_next("p")
soup.find_next("p")
  • 找父标签
soup.find_parents("div")
soup.find_parent("div")
  • css选择器
soup.select("title") #标签名
soup.select("html head title") #多级标签名
soup.select("p > a") #p内的所有a标签
soup.select("p > #link1") #P标签内,按id查标签
soup.select("#link1 ~ .sister") #查找相同class的兄弟节点
soup.select("#link1 + .sister")
soup.select(".sister") #按class名称查
soup.select("#sister") #按id名称查
soup.select('a[href="http://example.com/elsie" rel="external nofollow" ]') # 按标签的属性查
soup.select('a[href$="tillie"]')
soup.select_one(".sister")

注意几个可能出现的错误,可以用try捕获来防止爬虫进程

  • UnicodeEncodeError: ‘charmap' codec can't encode character u'\xfoo' in position bar (或其它类型的 UnicodeEncodeError

需要转码

  • AttributeError: ‘NoneType' object has no attribute ‘foo'

没这个属性

就介绍这么多,应该可以覆盖大部分网页结构了吧~!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
使用Python构建Hopfield网络的教程
Apr 14 Python
python判断给定的字符串是否是有效日期的方法
May 13 Python
python实现用户登录系统
May 21 Python
儿童python练习实例
May 27 Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 Python
Python 复平面绘图实例
Nov 21 Python
python实现画出e指数函数的图像
Nov 21 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
flask 实现上传图片并缩放作为头像的例子
Jan 09 Python
动态设置django的model field的默认值操作步骤
Mar 30 Python
Keras 切换后端方式(Theano和TensorFlow)
Jun 19 Python
Python文件的操作示例的详细讲解
Apr 08 Python
python3实现指定目录下文件sha256及文件大小统计
Feb 25 #Python
Python常用爬虫代码总结方便查询
Feb 25 #Python
Python使用paramiko操作linux的方法讲解
Feb 25 #Python
详解Django中CBV(Class Base Views)模型源码分析
Feb 25 #Python
Python判断对象是否相等及eq函数的讲解
Feb 25 #Python
详解django中url路由配置及渲染方式
Feb 25 #Python
利用python脚本如何简化jar操作命令
Feb 24 #Python
You might like
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
js实现ifram取父窗口URL地址的方法
2015/02/09 Javascript
jQuery源码解读之removeAttr()方法分析
2015/02/20 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
JS动态显示表格上下frame的方法
2015/03/31 Javascript
TypeScript 中接口详解
2015/06/19 Javascript
Angular 根据 service 的状态更新 directive
2016/04/03 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
jquery 属性选择器(匹配具有指定属性的元素)
2016/09/06 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
2018/07/23 Javascript
layDate日期控件使用方法详解
2018/11/15 Javascript
JavaScript中Dom操作实例详解
2019/07/08 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
简单上手Python中装饰器的使用
2015/07/12 Python
关于python的bottle框架跨域请求报错问题的处理方法
2017/03/19 Python
Python实现的特征提取操作示例
2018/12/03 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
Django实现跨域的2种方法
2019/07/31 Python
快速解决docker-py api版本不兼容的问题
2019/08/30 Python
使用python 对验证码图片进行降噪处理
2019/12/18 Python
Python Print实现在输出中插入变量的例子
2019/12/25 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
2020/06/18 Python
python matplotlib库的基本使用
2020/09/23 Python
python实现感知机模型的示例
2020/09/30 Python
Python3如何使用range函数替代xrange函数
2020/10/05 Python
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
J2EE是技术还是平台还是框架
2016/08/14 面试题
小学教师事迹材料
2014/01/13 职场文书
高考励志标语
2014/06/05 职场文书
2014入党积极分子批评与自我批评思想报告
2014/10/06 职场文书
教师作风建设剖析材料
2014/10/11 职场文书
先进员工事迹材料
2014/12/20 职场文书
Java并发编程之详解CyclicBarrier线程同步
2021/06/23 Java/Android