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下调用pytesseract识别某网站验证码的实现方法
Jun 06 Python
Python实现多线程HTTP下载器示例
Feb 11 Python
Python使用正则表达式抓取网页图片的方法示例
Apr 21 Python
python tkinter库实现气泡屏保和锁屏
Jul 29 Python
利用pyecharts实现地图可视化的例子
Aug 12 Python
初次部署django+gunicorn+nginx的方法步骤
Sep 11 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
Sep 24 Python
python进程池实现的多进程文件夹copy器完整示例
Nov 27 Python
浅谈keras 的抽象后端(from keras import backend as K)
Jun 16 Python
Python sklearn中的.fit与.predict的用法说明
Jun 28 Python
如何用python免费看美剧
Aug 11 Python
python 实现全球IP归属地查询工具
Dec 18 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
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
我的群发邮件程序
2006/10/09 PHP
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
php替换字符串中间字符为省略号的方法
2015/05/04 PHP
Js+XML 操作
2006/09/20 Javascript
向当前style sheet中插入一个新的style实现方法
2013/04/01 Javascript
关闭页面时window.location事件未执行的原因分析及解决方案
2014/09/01 Javascript
JS实现跟随鼠标闪烁转动色块的方法
2015/02/26 Javascript
jQuery调用ajax请求的常见方法汇总
2015/03/24 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
BootStrap中Table分页插件使用详解
2016/10/09 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
js实现登录拖拽窗口
2020/02/10 Javascript
python使用urllib2模块获取gravatar头像实例
2013/12/18 Python
深入理解Django的中间件middleware
2018/03/14 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
python实现实时视频流播放代码实例
2020/01/11 Python
python中Ansible模块的Playbook的具体使用
2020/05/28 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
Python爬虫爬取微信朋友圈
2020/08/06 Python
HTML5 微格式和相关的属性名称
2010/02/10 HTML / CSS
惊艳的手工时装首饰:Migonne Gavigan
2018/02/23 全球购物
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
英国领先的体验日提供商:Buyagift
2019/04/19 全球购物
中科软测试工程师面试题
2012/06/16 面试题
监理资料员岗位职责
2014/01/03 职场文书
客户表扬信范文
2014/01/10 职场文书
网络研修随笔感言
2014/02/17 职场文书
文明市民先进事迹
2014/05/15 职场文书
2016继续教育研修日志
2015/11/13 职场文书
商业计划书格式、范文
2019/03/21 职场文书
2019大学生实习报告
2019/06/21 职场文书