BeautifulSoup4系列二
前言
本篇详细介绍beautifulsoup4的功能,从最基础的开始讲起,让小伙伴们都能入门
一、读取HTML页面
1.先写一个简单的html页面,把以下内容copy出来,保存为html格式文件
<meta charset="UTF-8"> <!-- for HTML5 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<html><head><title>yoyo ketang</title></head>
<body>
<b><!--Hey, this in comment!--></b>
<p class="title"><b>yoyoketang</b></p>
<p class="yoyo">这里是我的微信公众号:yoyoketang
<a href="http://www.cnblogs.com/yoyoketang/tag/fiddler/" class="sister" id="link1">fiddler</a>,
<a href="http://www.cnblogs.com/yoyoketang/tag/python/" class="sister" id="link2">python</a>,
<a href="http://www.cnblogs.com/yoyoketang/tag/selenium/" class="sister" id="link3">selenium</a>;
快来关注吧!</p>
<p class="story">...</p>
2.为了学习方便,可以把此html文件和脚本放同一文件夹下
3.用python的open函数读取这个html,如下图能正确打印出来,说明读取成功了
二、解析器:html.parser
1.用BeautifulSoup的构造方法,就能得到一个文档的对象, 可以传入一段字符串或一个文件句柄
2.如果我们调用BeautifulSoup这个类的时候,不带"html.parser"参数,这时候会有个waring的,下图红色框框区域给出了建议。
3.html.parser这个是python库里面自带的解析器,无需安装。
4.prettify()这个方法是把文件解析成html格式,用html的标准格式输出(有缩进的)
三、对象的种类
1.Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
Tag : 标签对象,如:<p class="title"><b>yoyoketang</b></p>,这就是一个标签
NavigableString :字符对象,如:这里是我的微信公众号:yoyoketang
BeautifulSoup :就是整个html对象
Comment :注释对象,如:!-- for HTML5 --,它其实就是一个特殊NavigableString
2.弄清楚了这四个对象,后面所有的操作但是基于这四个(其实最后面一个comment可以忽略,几乎用不到)
四、Tag对象
1.html里面识别一个tag,其实一般像这种:
<p class="title"><b>yoyoketang</b></p>
<b>yoyoketang</b>
<head><title>yoyo ketang</title></head>
以上这些都是tag,很明显都是以<xx 开头</xx> 结尾这种,就是一个完整的tag
2.通过标签的名称,来获取tag对象
3.如果有多个相同的标签名称,返回的是第一个
五、Tag对象:name属性
1.tag的name属性,每一个tag都有name属性,用.name获取,如上面的三个name属性分别为p,b,head。也就是<xx开头的,这里的xx就是它的name属性
2.html是一个树状结构的,每个tag都有属性,整个html对象也有name属性,它的属性是:[document]
六、Tag对象:Attributes
1.tag.attrs可以打印出所有的属性,可以看出是个字典格式的
2.那么获取其中的某一个属性,就跟操作字典一样,如:tag["href"]
3.由于class属性一般可以为多个,中间空格隔开,所以class属性获取的是一个list类型:[u'sister']
4.tag.string,这里Tag对象变成NavigableString对象了,呵呵小伙伴们要懵逼了吧。其实打印出来就是一个字符串。
七、发福利
1.爬糗事百科首页的段子
# coding:utf-8
from bs4 import BeautifulSoup
import requests
r = requests.get("https://www.qiushibaike.com/")
qiubai = r.content
soup = BeautifulSoup(qiubai, "html.parser")
duanzi = soup.find_all(class_="content")
for i in duanzi:
# tag的 .contents 属性可以将tag的子节点以列表的方式输出
duan = i.span.contents[0] # 取第一个
print duan
BeautifulSoup4系列二的更多相关文章
- 前端构建大法 Gulp 系列 (二):为什么选择gulp
系列目录 前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gul ...
- WPF入门教程系列二十三——DataGrid示例(三)
DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...
- Web 开发人员和设计师必读文章推荐【系列二十九】
<Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Web 前端开发人员和设计师必读文章推荐【系列二十八】
<Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Web 开发精华文章集锦(jQuery、HTML5、CSS3)【系列二十七】
<Web 前端开发精华文章推荐>2014年第6期(总第27期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Web 前端开发人员和设计师必读精华文章【系列二十六】
<Web 前端开发精华文章推荐>2014年第5期(总第26期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十三】
<Web 前端开发精华文章推荐>2014年第2期(总第23期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】
<Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...
- 【圣诞特献】Web 前端开发精华文章推荐【系列二十一】
<Web 前端开发精华文章推荐>2013年第九期(总第二十一期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 ...
随机推荐
- h5-16-SVG 与 HTML5 的 canvas 各自特点
1. Canvas是使用JavaScript程序绘图(动态生成),SVG是使用XML文档描述来绘图.2.SVG更适合用来做动态交互,而且SVG绘图很容易编辑,只需要增加或移除相应的元素就可以了.同时S ...
- MySQL执行带out的存储过程
CALL `sp_sys_get_code`(3,'sys_customer',@code); SELECT @code
- 关于c#的结构体struct与class的区别
C# 结构体 struct C#中结构类型和类类型在语法上非常相似,他们都是一种数据结构,都可以包括数据成员和方法成员. 结构和类的区别: 1.结构是值类型,它在栈中分配空间:而类是引用类型,它在堆中 ...
- python2和python3的区别(转)
基本语法差异 核心类差异 Python3对Unicode字符的原生支持 Python2中使用 ASCII 码作为默认编码方式导致string有两种类型str和unicode,Python3只支持uni ...
- 定时器、线程queue、进程池和线程池
1.定时器 指定n秒后,执行任务 from threading import Timer,current_thread import os def hello(): print("%s he ...
- Android Gradle与Gradle插件的对应关系
查看链接 https://blog.csdn.net/dazhong2012/article/details/80585834
- Qt获取本机IP地址
Qt获取本机IP地址: Qt版本:4.8.6 #include <QtNetwork/QNetworkInterface.h> QString ipAddr; QList<QHost ...
- vue项目中常用的一些公共方法
//校验手机号码 export function isSpecialPhone(num) { return /^1[2,3,4,5,7,8]\d{9}$/.test(num) } //校验中英文姓名 ...
- Jenkins执行sudo权限的设置
Jenkins系统中添加执行脚本的时候,有一些命令是需要sudo权限和来执行的,可以在root权限下添加一下Jenkins账号的权限 1.添加不需要密码可sudo执行指定命令的权限 cd /etc c ...
- 原创:shell两个整数的比较 思想版
思想是学的 代码创作是自己的 很喜欢前几行的逻辑严谨 #!/bin/bash#判断两个整数的大小read -p "请输入两个整数a b :" a b #或者使用a=$1[ -z & ...