前言

本篇详细介绍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系列二的更多相关文章

  1. 前端构建大法 Gulp 系列 (二):为什么选择gulp

    系列目录 前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gul ...

  2. WPF入门教程系列二十三——DataGrid示例(三)

    DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...

  3. Web 开发人员和设计师必读文章推荐【系列二十九】

    <Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  4. Web 前端开发人员和设计师必读文章推荐【系列二十八】

    <Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  5. Web 开发精华文章集锦(jQuery、HTML5、CSS3)【系列二十七】

    <Web 前端开发精华文章推荐>2014年第6期(总第27期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  6. Web 前端开发人员和设计师必读精华文章【系列二十六】

    <Web 前端开发精华文章推荐>2014年第5期(总第26期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  7. Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十三】

    <Web 前端开发精华文章推荐>2014年第2期(总第23期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  8. Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】

    <Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...

  9. 【圣诞特献】Web 前端开发精华文章推荐【系列二十一】

    <Web 前端开发精华文章推荐>2013年第九期(总第二十一期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和  ...

随机推荐

  1. Educational Codeforces Round 46 (Rated for Div. 2) C. Covered Points Count

    Bryce1010模板 http://codeforces.com/problemset/problem/1000/C 题意:问你从[l,r]区间的被多少条线覆盖,列出所有答案. 思路:类似括号匹配的 ...

  2. 树状数组 POJ 2481 Cows

    题目传送门 #include <cstdio> #include <cstring> #include <algorithm> using namespace st ...

  3. [转]如何使用MFC和类型库创建自动化项目

    本文转自:http://www.cnblogs.com/zhoug2020/archive/2012/04/01/2429064.html 摘要 本文详细介绍了如何自动化像Microsoft Offi ...

  4. P2658 汽车拉力比赛

    题目描述 博艾市将要举行一场汽车拉力比赛. 赛场凹凸不平,所以被描述为M*N的网格来表示海拔高度(1≤ M,N ≤500),每个单元格的海拔范围在0到10^9之间. 其中一些单元格被定义为路标.组织者 ...

  5. spring boot 的redis 之初理解

    项目到末尾了快, 这几天安排我结合业务场景给项目加上redis 缓存, 我接到这个任务也是懵逼了一会儿: 问了一句让我自己先想办法,没办法硬着头皮查吧, 要不不得不说spring boot 还是好用, ...

  6. BZOJ1132: [POI2008]Tro(叉积 排序)

    题意 世上最良心题目描述qwq 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Sol 直接模拟是$n^3$的. 考虑先枚举一个$i$,那么我们要算的就是$\sum_ ...

  7. Vue 2.0入门基础知识之全局API

    3.全局API 3-1. Vue.directive 自定义指令 Vue.directive用于自定义全局的指令 实例如下: <body> <div id="app&quo ...

  8. 关于bin和obj文件夹。debug 和release的区别(转)

    关于bin和obj文件夹. 楼主hcaihao(影子男孩)2002-05-29 20:04:24 在 .NET技术 / C# 提问 VS.Net会生成bin和obj文件夹以及它们下面的Debug和Re ...

  9. JSP和Servlet性能优化经验谈

    你的J2EE应用是不是运行的很慢?它们能不能承受住不断上升的访问量?本文讲述了开发高性能.高弹性的JSP页面和Servlet的性能优化技术.其意思是建立尽可能快的并能适应数量增长的用户及其请求.在本文 ...

  10. js单线程和js异步操作的几种方法

    一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事. JavaScript的单线程,与它的用途有关.作为浏览器脚本语言,JavaS ...