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 相关文章推荐
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
Apr 16 Python
Python扫描IP段查看指定端口是否开放的方法
Jun 09 Python
浅析AST抽象语法树及Python代码实现
Jun 06 Python
Python内置函数—vars的具体使用方法
Dec 04 Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
Feb 13 Python
Python基于更相减损术实现求解最大公约数的方法
Apr 04 Python
Python判断有效的数独算法示例
Feb 23 Python
python中tkinter的应用:修改字体的实例讲解
Jul 17 Python
pytorch 实现cross entropy损失函数计算方式
Jan 02 Python
python中线程和进程有何区别
Jun 17 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
Aug 07 Python
python实现学生信息管理系统源码
Feb 22 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
全国FM电台频率大全 - 12 安徽省
2020/03/11 无线电
MySql数据库查询结果用表格输出PHP代码示例
2015/03/20 PHP
PHP变量赋值、代入给JavaScript中的变量
2015/06/29 PHP
php如何实现只替换一次或N次
2015/10/29 PHP
Yii rules常用规则示例
2016/03/15 PHP
微信支付开发维权通知实例
2016/07/12 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
Thinkphp实现短信验证注册功能
2016/10/18 PHP
JavaScript 版本自动生成文章摘要
2008/07/23 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
JavaScript严格模式详解
2015/11/18 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
ES6学习之变量的解构赋值
2017/02/12 Javascript
JavaScript数据结构中串的表示与应用实例
2017/04/12 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
js实现数字递增特效【仿支付宝我的财富】
2017/05/05 Javascript
vue-ajax小封装实例
2017/09/18 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
Ruby元编程基础学习笔记整理
2016/07/02 Python
Python列表删除的三种方法代码分享
2017/10/31 Python
python实现飞机大战
2018/09/11 Python
python SQLAlchemy的Mapping与Declarative详解
2019/07/04 Python
如何基于Python实现自动扫雷
2020/01/06 Python
上课说话检讨书大全
2014/01/22 职场文书
超市重阳节活动方案
2014/02/10 职场文书
广告学专业自荐信范文
2014/02/24 职场文书
《悯农》教学反思
2014/04/28 职场文书
学生检讨书
2015/01/27 职场文书
消防宣传标语大全
2015/08/03 职场文书
小学班主任心得体会
2016/01/07 职场文书
解决Goland 同一个package中函数互相调用的问题
2021/05/06 Golang
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS