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计算N天之后日期的方法
Mar 31 Python
一些Python中的二维数组的操作方法
May 02 Python
Python在Console下显示文本进度条的方法
Feb 14 Python
Python3简单实例计算同花的概率代码
Dec 06 Python
Python 实现淘宝秒杀的示例代码
Jan 02 Python
Java编程迭代地删除文件夹及其下的所有文件实例
Feb 10 Python
如何实现删除numpy.array中的行或列
May 08 Python
python3 实现对图片进行局部切割的方法
Dec 05 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
Jan 26 Python
基于python实现破解滑动验证码过程解析
May 28 Python
Python tkinter之Bind(绑定事件)的使用示例
Feb 05 Python
Python实战之OpenCV实现猫脸检测
Jun 26 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 DataGrid 实现代码
2009/08/12 PHP
php下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
微信小程序 获取session_key和openid的实例
2017/08/17 Javascript
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
vue实现短信验证码登录功能(流程详解)
2019/12/10 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
2020/10/17 Javascript
详解django中自定义标签和过滤器
2017/07/03 Python
Python实现冒泡排序的简单应用示例
2017/12/11 Python
Python 循环语句之 while,for语句详解
2018/04/23 Python
详解用python生成随机数的几种方法
2019/08/04 Python
Python3 Tkinkter + SQLite实现登录和注册界面
2019/11/19 Python
如何清空python的变量
2020/07/05 Python
纯css3实现的竖形无限级导航
2014/12/10 HTML / CSS
Stio官网:男女、儿童户外服装
2019/12/13 全球购物
Python的两道面试题
2013/06/29 面试题
Java基础类库面试题
2013/09/04 面试题
专业毕业生个性的自我评价
2013/10/03 职场文书
建筑设计师岗位职责
2013/11/18 职场文书
主题班会演讲稿
2014/05/22 职场文书
商场周年庆活动方案
2014/08/19 职场文书
迎国庆演讲稿
2014/09/05 职场文书
2014四风问题对照检查材料范文
2014/09/15 职场文书
终止劳动合同协议书
2014/10/05 职场文书
幼儿园感恩节活动方案2014
2014/10/11 职场文书
2015年房产经纪人工作总结
2015/05/15 职场文书
《水浒传》读后感3篇(范文)
2019/09/19 职场文书