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二分查找算法的递归实现方法
May 12 Python
Python脚本实时处理log文件的方法
Nov 21 Python
Python中关于Sequence切片的下标问题详解
Jun 15 Python
Python 操作文件的基本方法总结
Aug 10 Python
Python处理文本换行符实例代码
Feb 03 Python
Python简单爬虫导出CSV文件的实例讲解
Jul 06 Python
python得到windows自启动列表的方法
Oct 14 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
Jul 23 Python
使用python求斐波那契数列中第n个数的值示例代码
Jul 26 Python
python help函数实例用法
Dec 06 Python
python中实现栈的三种方法
Dec 19 Python
Python包argparse模块常用方法
Jun 04 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中文竖排转换实现方法
2015/10/23 PHP
PHP实现的数组和XML文件相互转换功能示例
2018/03/15 PHP
YII分模块加载路由的实现方法
2018/10/01 PHP
Mootools 1.2教程 类(一)
2009/09/15 Javascript
jQuery 版元素拖拽原型代码
2011/04/25 Javascript
jQuery动态添加 input type=file的实现代码
2012/06/14 Javascript
javascript分页代码(当前页码居中)
2012/09/20 Javascript
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
jQuery之日期选择器的深入解析
2013/06/19 Javascript
关闭浏览器时提示onbeforeunload事件
2013/12/25 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
深入理解JS中的Function.prototype.bind()方法
2016/10/11 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
2016/12/26 Javascript
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
2017/07/05 Javascript
Vue波纹按钮组件制作
2018/04/30 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
谈谈React中的Render Props模式
2018/12/06 Javascript
浅谈Vue 性能优化之深挖数组
2018/12/11 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
[05:02][DOTA2]DOTA进化论 第一期
2013/09/27 DOTA
python 动态获取当前运行的类名和函数名的方法
2014/04/15 Python
Python编程求解二叉树中和为某一值的路径代码示例
2018/01/04 Python
为什么说Python可以实现所有的算法
2019/10/04 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
一款利用html5和css3实现的3D立方体旋转效果教程
2016/04/26 HTML / CSS
台湾前三大B2C购物网站:MOMO购物网
2017/04/27 全球购物
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
医学生个人求职信范文
2013/09/24 职场文书
最新会计专业求职信范文
2014/01/28 职场文书
安全保证书范文
2014/04/29 职场文书
竞聘上岗演讲稿
2014/05/16 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
商业计划书范文
2019/04/24 职场文书
详解nodejs内置模块
2021/05/06 NodeJs