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字符串转换成浮点数函数分享
Jul 24 Python
Python 稀疏矩阵-sparse 存储和转换
May 27 Python
Django 生成登陆验证码代码分享
Dec 12 Python
Python实现的读取电脑硬件信息功能示例
May 30 Python
python实现自动网页截图并裁剪图片
Jul 30 Python
解决pycharm无法识别本地site-packages的问题
Oct 13 Python
解决Python3.5+OpenCV3.2读取图像的问题
Dec 05 Python
python实现socket+threading处理多连接的方法
Jul 23 Python
python定时任务 sched模块用法实例
Nov 04 Python
python3.6使用SMTP协议发送邮件
May 20 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
Sep 03 Python
Scrapy 配置动态代理IP的实现
Sep 28 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多用户计数器代码
2007/03/11 PHP
PHP 引用文件技巧
2010/03/02 PHP
PHP编程函数安全篇
2013/01/08 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
javaScript对象和属性的创建方法
2007/01/15 Javascript
jquery1.4后 jqDrag 拖动 不可用
2010/02/06 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
2014/06/10 Javascript
javascript动态判断html元素并执行不同的操作
2014/06/16 Javascript
javascript父、子页面交互技巧总结
2014/08/08 Javascript
js解决select下拉选不中问题
2014/10/14 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
js获取Html元素的实际宽度高度的方法
2016/05/19 Javascript
原生js仿jquery一些常用方法(必看篇)
2016/09/20 Javascript
JavaScript递归操作实例浅析
2016/10/31 Javascript
概述如何实现一个简单的浏览器端js模块加载器
2016/12/07 Javascript
详解浏览器渲染页面过程
2017/02/09 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
js实现鼠标切换图片(无定时器)
2021/01/27 Javascript
Python3处理文件中每个词的方法
2015/05/22 Python
Python修改MP3文件的方法
2015/06/15 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
基于Python正确读取资源文件
2020/09/14 Python
python tkinter的消息框模块(messagebox,simpledialog)
2020/11/07 Python
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
英国奢侈品在线精品店:Hervia
2020/09/03 全球购物
学生党员思想汇报
2013/12/28 职场文书
干部行政关系介绍信
2014/01/17 职场文书
银行开业庆典方案
2014/02/06 职场文书
房产买卖委托公证书
2014/04/04 职场文书
机关党建工作汇报材料
2014/08/20 职场文书
教师节感谢信
2015/01/22 职场文书
给领导的感谢信范文
2015/01/23 职场文书
爱牙日宣传活动总结
2015/02/05 职场文书
2016春节慰问信范文
2015/03/25 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang