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 相关文章推荐
django模型中的字段和model名显示为中文小技巧分享
Nov 18 Python
python在windows下创建隐藏窗口子进程的方法
Jun 04 Python
python开发之thread实现布朗运动的方法
Nov 11 Python
21行Python代码实现拼写检查器
Jan 25 Python
Python 解决中文写入Excel时抛异常的问题
May 03 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
Aug 02 Python
python 多个参数不为空校验方法
Feb 14 Python
python面试题Python2.x和Python3.x的区别
May 28 Python
python读写文件write和flush的实现方式
Feb 21 Python
python实现批量修改文件名
Mar 23 Python
Python通过类的组合模拟街道红绿灯
Sep 16 Python
python中str内置函数用法总结
Dec 27 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小技巧之过滤ascii控制字符
2014/05/14 PHP
PHP访问Google Search API的方法
2015/03/05 PHP
php格式化时间戳
2016/12/17 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
2019/10/16 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
Extjs列表详细信息窗口新建后自动加载解决方法
2010/04/02 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
js几秒以后倒计时跳转示例
2013/12/26 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
js淡入淡出焦点图幻灯片效果代码分享
2015/09/08 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
jQuery中DOM节点删除之empty与remove
2017/01/20 Javascript
基于Bootstrap的网页设计实例
2017/03/01 Javascript
iscroll实现下拉刷新功能
2017/07/18 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
JavaScript函数定义方法实例详解
2019/03/05 Javascript
新手简单了解vue
2019/05/29 Javascript
小程序外卖订单界面的示例代码
2019/12/30 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
Python多线程爬虫简单示例
2016/03/04 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
Python3实现定时任务的四种方式
2019/06/03 Python
python实现把二维列表变为一维列表的方法分析
2019/10/08 Python
python 自定义异常和主动抛出异常(raise)的操作
2020/12/11 Python
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
Origins加拿大官网:雅诗兰黛集团高端植物护肤品牌
2017/11/19 全球购物
linux面试题参考答案(7)
2012/10/29 面试题
公司授权委托书范文
2014/08/02 职场文书
公司介绍信范文
2015/01/31 职场文书
2015年医务科工作总结范文
2015/05/26 职场文书
妈妈别哭观后感
2015/06/08 职场文书
如何制作自己的原生JavaScript路由
2021/05/05 Javascript
Go 通过结构struct实现接口interface的问题
2021/10/05 Golang