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 27 Python
Python单元测试框架unittest使用方法讲解
Apr 13 Python
python中循环语句while用法实例
May 16 Python
python检测是文件还是目录的方法
Jul 03 Python
python获取文件扩展名的方法
Jul 06 Python
完美解决在oj中Python的循环输入问题
Jun 25 Python
python微元法计算函数曲线长度的方法
Nov 08 Python
Python的条件表达式和lambda表达式实例
Jan 31 Python
python实现扫描局域网指定网段ip的方法
Apr 16 Python
使用Python实现图像标记点的坐标输出功能
Aug 14 Python
Django中的AutoField字段使用
May 18 Python
Python基础教程,Python入门教程(超详细)
Jun 24 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的Laravel框架中Eloquent对象关系映射使用
2016/02/26 PHP
JS 文件传参及处理技巧分析
2010/05/13 Javascript
jQuery参数列表集合
2011/04/06 Javascript
js调用webservice中的方法实现思路及代码
2013/02/25 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
js处理表格对table进行修饰
2014/05/26 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
简单介绍JavaScript中字符串创建的基本方法
2015/07/07 Javascript
jquery验证邮箱格式并显示提交按钮
2015/11/07 Javascript
jQuery EasyUI右键菜单实现关闭标签/选项卡
2016/10/10 Javascript
Angular多选、全选、批量选择操作实例代码
2017/03/10 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
javascript简单写的判断电话号码实例
2017/05/24 Javascript
关于vue单文件中引用路径的处理方法
2018/01/08 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
axios发送post请求springMVC接收不到参数的解决方法
2018/03/05 Javascript
微信小程序之分享页面如何返回首页的示例
2018/03/28 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
Vue Object 的变化侦测实现代码
2020/04/15 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
2020/08/06 Javascript
微信小程序实现打卡签到页面
2020/09/21 Javascript
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
python学习将数据写入文件并保存方法
2020/06/07 Python
纽约通行卡:The New York Pass(免费游览纽约90多个景点)
2017/07/29 全球购物
美赞臣新加坡官方旗舰店:Enfagrow新加坡
2019/05/15 全球购物
Ray-Ban雷朋奥地利官网:全球领先的太阳眼镜品牌
2020/10/12 全球购物
传播学毕业生求职信
2013/10/11 职场文书
水务局局长岗位职责
2013/11/28 职场文书
幼儿园老师辞职信
2014/01/20 职场文书
社区居务公开实施方案
2014/03/27 职场文书
缅怀先烈演讲稿
2014/09/03 职场文书
毕业论文答辩开场白
2015/05/27 职场文书
调研报告的主要写法
2019/04/18 职场文书
导游词之青岛崂山
2019/12/27 职场文书