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之变量和参数
Oct 10 Python
Python中使用Flask、MongoDB搭建简易图片服务器
Feb 04 Python
Python程序中设置HTTP代理
Nov 06 Python
新手常见6种的python报错及解决方法
Mar 09 Python
Django跨域请求问题的解决方法示例
Jun 16 Python
解决python selenium3启动不了firefox的问题
Oct 13 Python
Python命名空间的本质和加载顺序
Dec 17 Python
python实现定时发送qq消息
Jan 18 Python
Pytorch Tensor的统计属性实例讲解
Dec 30 Python
pytorch中的卷积和池化计算方式详解
Jan 03 Python
Python数据结构dict常用操作代码实例
Mar 12 Python
Django使用rest_framework写出API
May 21 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函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
php 多关键字 高亮显示实现代码
2012/04/23 PHP
php curl_init函数用法
2014/01/31 PHP
PHP三元运算的2种写法代码实例
2014/05/12 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
PHP加密解密类实例分析
2015/04/20 PHP
PHP读取汉字的点阵数据
2015/06/22 PHP
php远程下载类分享
2016/04/13 PHP
Smarty3配置及入门语法
2017/02/22 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
2020/12/01 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
JS继承 笔记
2011/07/13 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
分享一款基于jQuery的视频播放插件
2014/10/09 Javascript
JavaScript动态添加列的方法
2015/03/25 Javascript
微信小程序 传值取值的几种方法总结
2017/01/16 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
2018/12/24 Python
使用PYTHON解析Wireshark的PCAP文件方法
2019/07/23 Python
python 标准差计算的实现(std)
2019/07/29 Python
python支持多继承吗
2020/06/19 Python
利用HTML5绘制点线面组成的3D图形的示例
2015/05/12 HTML / CSS
大学生的四年学习自我评价
2013/12/13 职场文书
护理个人求职信范文
2014/01/08 职场文书
电大毕业生自我鉴定
2014/04/10 职场文书
城南旧事观后感
2015/06/11 职场文书
贷款收入证明范本
2015/06/12 职场文书
小学语文的各类谚语(70首)
2019/08/15 职场文书
CSS 伪元素::marker详解
2021/06/26 HTML / CSS
Python 快速验证代理IP是否有效的方法实现
2021/07/15 Python
Python制作表白爱心合集
2022/01/22 Python