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 输出一个两行字符的变量
Feb 05 Python
本地文件上传到七牛云服务器示例(七牛云存储)
Jan 11 Python
Python中函数的参数定义和可变参数用法实例分析
Jun 04 Python
Python基于Tkinter实现的记事本实例
Jun 17 Python
Python中对元组和列表按条件进行排序的方法示例
Nov 10 Python
Python实现打印螺旋矩阵功能的方法
Nov 21 Python
python读取指定字节长度的文本方法
Aug 27 Python
python设置环境变量的作用整理
Feb 17 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
Mar 10 Python
opencv-python的RGB与BGR互转方式
Jun 02 Python
Python实现进度条和时间预估的示例代码
Jun 02 Python
python使用scapy模块实现ARP扫描的过程
Jan 21 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 sprintf()函数用例解析
2011/05/18 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
2016/05/20 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
PHP错误处理函数register_shutdown_function使用示例
2017/07/03 PHP
MSN消息提示类
2006/09/05 Javascript
表单内同名元素的控制
2006/11/22 Javascript
一个javascript参数的小问题
2008/03/02 Javascript
JS时间选择器 兼容IE6,7,8,9
2012/06/26 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
2013/09/16 Javascript
Json和Jsonp理论实例代码详解
2013/11/15 Javascript
简单js代码实现selece二级联动(推荐)
2014/02/18 Javascript
14个有用的Jquery技巧分享
2015/01/08 Javascript
浅谈Javascript数组的使用
2015/07/29 Javascript
复杂的javascript窗口分帧解析
2016/02/19 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
2016/12/08 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
2017/05/17 Javascript
微信小程序项目实践之验证码倒计时功能
2018/07/18 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
使用vue实现HTML页面生成图片的方法
2020/03/12 Javascript
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
2015/04/28 Python
Django框架中处理URLconf中特定的URL的方法
2015/07/20 Python
python 获取键盘输入,同时有超时的功能示例
2018/11/13 Python
python2.7实现邮件发送功能
2018/12/12 Python
Python函数中的可变长参数详解
2019/09/12 Python
通过实例解析Python调用json模块
2019/12/11 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
python中round函数保留两位小数的方法
2020/12/04 Python
英国潮流网站:END.(全球免邮)
2017/01/16 全球购物
厨师长岗位职责
2014/03/02 职场文书
老公爱的承诺书
2014/03/31 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
购房协议书范本
2014/10/02 职场文书
家属联谊会致辞
2015/07/31 职场文书