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套接字流重定向实例汇总
Mar 03 Python
Python 绘图和可视化详细介绍
Feb 11 Python
Python数据分析之获取双色球历史信息的方法示例
Feb 03 Python
Python画柱状统计图操作示例【基于matplotlib库】
Jul 04 Python
Flask实现图片的上传、下载及展示示例代码
Aug 03 Python
解决python打不开文件(文件不存在)的问题
Feb 18 Python
使用Python操作FTP实现上传和下载的方法
Apr 01 Python
python flask几分钟实现web服务的例子
Jul 26 Python
django自定义模板标签过程解析
Dec 14 Python
Tensorflow与Keras自适应使用显存方式
Jun 22 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
Sep 01 Python
分析Python list操作为什么会错误
Nov 17 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
网络资源
2006/10/09 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
PHP如何通过表单直接提交大文件详解
2019/01/08 PHP
thinkphp5.1框架模板赋值与变量输出示例
2020/05/25 PHP
javascript之更有效率的字符串替换
2008/08/02 Javascript
jquery制作弹窗提示窗口代码分享
2014/03/02 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
2015/05/25 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
Angular.js跨controller实现参数传递的两种方法
2017/02/20 Javascript
微信小程序联网请求的轮播图
2017/07/07 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
vue进行图片的预加载watch用法实例讲解
2018/02/07 Javascript
使用Angular CLI生成 Angular 5项目教程详解
2018/03/18 Javascript
微信小程序封装自定义弹窗的实现代码
2019/05/08 Javascript
微信小程序商品详情页底部弹出框
2019/11/22 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
python基础教程之类class定义使用方法
2014/02/20 Python
使用python 爬虫抓站的一些技巧总结
2018/01/10 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
2019/02/21 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
django xadmin action兼容自定义model权限教程
2020/03/30 Python
Python 字符串池化的前提
2020/07/03 Python
pandas to_excel 添加颜色操作
2020/07/14 Python
python批量修改交换机密码的示例
2020/09/22 Python
西班牙宠物用品和食品网上商店:Tiendanimal
2019/06/06 全球购物
中学教师管理制度
2014/01/14 职场文书
创建服务型党组织实施方案
2014/02/25 职场文书
档案信息化建设方案
2014/05/16 职场文书
2014离婚协议书范文
2014/09/10 职场文书
2014年学校工作总结
2014/11/20 职场文书
一个独生女的故事观后感
2015/06/04 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
导游词之无锡丝业博物馆
2019/11/12 职场文书
5行Python代码实现一键批量扣图
2021/06/29 Python