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爬取51job中hr的邮箱
May 14 Python
Python实现感知机(PLA)算法
Dec 20 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
Feb 06 Python
用Python写一段用户登录的程序代码
Apr 22 Python
Python解决线性代数问题之矩阵的初等变换方法
Dec 12 Python
Python字符串的全排列算法实例详解
Jan 07 Python
python opencv 图像拼接的实现方法
Jun 27 Python
python实现获取单向链表倒数第k个结点的值示例
Oct 24 Python
python怎么调用自己的函数
Jul 01 Python
解决Python 写文件报错TypeError的问题
Oct 23 Python
python 利用百度API识别图片文字(多线程版)
Dec 14 Python
python中spy++的使用超详细教程
Jan 29 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
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
2013/07/05 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
php缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
php之curl实现http与https请求的方法
2014/10/21 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
Yii2 rbac权限控制之rule教程详解
2016/06/23 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
一款JavaScript压缩工具:X2JSCompactor
2007/06/13 Javascript
Prototype使用指南之selector.js说明
2008/10/26 Javascript
浅析showModalDialog数据缓存问题(用禁止浏览器缓存解决)
2013/07/09 Javascript
怎么判断js脚本加载完成
2014/02/28 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
初识 Vue.js 中的 *.Vue文件
2017/11/22 Javascript
React Native基础入门之调试React Native应用的一小步
2018/07/02 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
2019/06/09 Javascript
Vue.js数字输入框组件使用方法详解
2019/10/19 Javascript
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
Python中tell()方法的使用详解
2015/05/24 Python
Python的string模块中的Template类字符串模板用法
2016/06/27 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
Django用户认证系统 组与权限解析
2019/08/02 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
2020/04/18 Python
浅谈Python_Openpyxl使用(最全总结)
2019/09/05 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
香蕉共和国工厂店:Banana Republic Factory
2018/06/09 全球购物
急诊科护士自我鉴定
2013/10/14 职场文书
酒吧员工的岗位职责
2013/11/26 职场文书
总会计师岗位职责
2014/02/19 职场文书
信息学院毕业生自荐信范文
2014/03/04 职场文书
关于感恩的演讲稿500字
2014/08/26 职场文书
餐饮食品安全责任书
2015/01/29 职场文书
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python
Lombok的详细使用及优缺点总结
2021/07/15 Java/Android
mysql 获取相邻数据项
2022/05/11 MySQL