【Python实例二】BeautifulSoup爬虫简单实践
前言
前面安装了BeautifulSoup库,现在就来实现一下吧。
目录
一、Urllib库的使用
二、BeautifulSoup的使用
三、 一个示例
------------------------------------------------------------------------------------------------------------
正文
一、Urllib库的使用
看了一些简单爬虫的资料,都用到了Urllib库,想必这也是与web爬取数据的基础,因此先去看了看Urllib库的相关内容。
按我自己的理解,爬取网页的内容其实就是先把页面的信息先通过Urllib库抓取到本地,然后再通过BeautifulSoup库来精细划分抓取得到的页面内容数据。
使用Urllib库的最基本方法其实就三行代码(如下):
# -*- coding: utf-8 -*-
import urllib res = urllib.urlopen("http://www.baidu.com")
print res.read()
具体解释:
- urllib库一般安装完Python后就自带在其安装包里面了,所以直接使用"import urllib"语句就能直接使用了;
- urllib.urlopen(url[, data[, proxies]]) :创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。
(参数url表示远程数据的路径,一般是网址;参数data表示以post方式提交到url的数据)
- urlopen()返回 一个类文件对象(此处用res来获取该对象),它提供了如下方法:read() , readline() , readlines() , fileno() , close()
- res.read()返回获取到的网页内容
最后输出的内容如下所示(相当于查看网页源码看到的内容)

二、BeautifulSoup的使用
在用Urllib库从网页上得到了网页数据后,就要开始使用BeautifulSoup了。
1. 首先创构造一个BeautifulSoup对象
下面有一些最简单的例子:
(1)通过字符串创建BeautifulSoup对象
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
helloworld = '<p>Hello World</p>'
soup_string = BeautifulSoup(helloworld, "html.parser")
print soup_string
结果:

(2)通过类文件对象创建BeautifulSoup对象
# -*- coding: utf-8 -*-
import urllib
from bs4 import BeautifulSoup url = "http://www.baidu.com"
page = urllib.urlopen(url)
soup = BeautifulSoup(page,"html.parser")
print soup
因为前面说的Urllib库用urlopen()返回的就是一个类文件对象,所以这里的结果和之前Urllib中对象调用read()得到的结果是一样的。
(3)通过本地文件对象创建BeautifulSoup对象
# -*- coding: utf-8 -*-
import urllib
from bs4 import BeautifulSoup with open('index.html','r') as foo_file :
soup_foo = BeautifulSoup(foo_file, "html.parser")
print soup_foo
【注意】以上的三种方法创建BeautifulSoup对象使用的语句是:BeautifulSoup(urllib库对象名, "html.parser"),其中标红的部分"html.parser"是我时间之后发现要加的,很多教程里面是直接使用 BeautifulSoup(urllib库对象名)来创建,但是我运行的时候会有一个warning:

于是就按照提示上说的,加上了"html.parser",运行之后果然正常了,所以如果你也遇到一样的问题,就还是加上它吧:)
2.使用BeautifulSoup库的 find()和findAll()函数
在构造好BeautifulSoup对象后,借助find()和findAll()这两个函数,可以通过标签的不同属性轻松地把繁多的html内容过滤为你所想要的。
这两个函数的使用很灵活,可以: 通过tag的id属性搜索标签、通过tag的class属性搜索标签、通过字典的形式搜索标签内容返回的为一个列表、通过正则表达式匹配搜索等等
基本使用格式:
pid = soup.find(attrs={"id":"aa"})
pid = soup.findAll('a',{'class':'sister'})
三. 一个示例
这个示例是我在查找资料的时候看到的,按照代码运行得出来,理解起来也简单,因此就借鉴一下
(原文地址:http://www.cnblogs.com/hearzeus/p/5151449.html)
下面是代码和效果:
# -*- coding: utf-8 -*-
import urllib
from bs4 import BeautifulSoup res = urllib.urlopen("http://www.douban.com/tag/%E5%B0%8F%E8%AF%B4/?focus=book")
soup = BeautifulSoup(res,"html.parser")
book_div = soup.find(attrs={"id":"book"})
book_a = book_div.findAll(attrs={"class":"title"})
for book in book_a:
print book.string

【Python实例二】BeautifulSoup爬虫简单实践的更多相关文章
- kafka原理和实践(二)spring-kafka简单实践
系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...
- 【Python实例二】之前期准备:Windows下的BeautifulSoup安装
前言 一直久闻Python的爬虫很高效,而且操作便捷,因此决定开始练习爬虫的相关内容. 首先尝试的是Python的爬虫利器之一:BeautifulSoup.(这名字听起来就有种想要去探究的兴趣.... ...
- python实例2-写一个爬虫下载小功能
主要是通过url,和re两个模块对一个网页的固定图片进行模糊匹配后下载下来. #! /usr/bin/python import re import urllib def gethtml(url): ...
- opencv python 图像二值化/简单阈值化/大津阈值法
pip install matplotlib 1简单的阈值化 cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表 ...
- python实例二
https://www.cnblogs.com/evablogs/p/6754974.html 题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于 ...
- python学习笔记(二)之python简单实践
1 安装python开发环境 Linux环境下自动安装好了python,可以通过以下命令更新到python最新版本. #echo "alias python=/usr/bin/python3 ...
- Python初学者之网络爬虫(二)
声明:本文内容和涉及到的代码仅限于个人学习,任何人不得作为商业用途.转载请附上此文章地址 本篇文章Python初学者之网络爬虫的继续,最新代码已提交到https://github.com/octans ...
- python beautifulsoup爬虫
爬虫这个听起来很 hack 的名字,是我学习 python 的诱因.当 python 基础学习到一定程度(基本语法,数据类型掌握) 就可以开启自己的小爬虫了.毕竟实践才是提高的最快途径.废话说完了,下 ...
- 初探爬虫 ——《python 3 网络爬虫开发实践》读书笔记
零.背景 之前在 node.js 下写过一些爬虫,去做自己的私人网站和工具,但一直没有稍微深入的了解,借着此次公司的新项目,体系的学习下. 本文内容主要侧重介绍爬虫的概念.玩法.策略.不同工具的列举和 ...
随机推荐
- Qt C++ 并发,并行,多线程编程系列1 什么是并发
什么是并发,并发往简单来说就是两个或多个独立的任务同时发生,在我们的生活中也是随处可见.如果把每个人都当作一个独立的任务,那每个人可以相互独立的生活,这就是并发. 在计算机的系统里面,并发一般有两种, ...
- 使用fiddler和jmeter进行简单的接口测试。
初学接口测试,以下内容是记录首次使用fiddler和jmeter进行接口测试的步骤,可能步骤有点繁琐,如果有不对的地方,欢迎大家指正. 准备活动: 1.打开fiddler,打开fiddler以后会自动 ...
- 用node是踩过的一些坑
1.http.request抓取数据时,response的“data”回调事件返回的数据不完整 问题原因:因为“data"事件返回是chunk,就是说是一块块连续的数据 解决的办法:在”da ...
- 树莓派的WIFI配置
参考网址: http://www.cnblogs.com/iusmile/archive/2013/03/30/2991139.html http://my.oschina.net/pikeman/b ...
- 基于规则的中文分词 - NLP中文篇
之前在其他博客文章有提到如何对英文进行分词,也说后续会增加解释我们中文是如何分词的,我们都知道英文或者其他国家或者地区一些语言文字是词与词之间有空格(分隔符),这样子分词处理起来其实是要相对容易很多, ...
- 传统IT七大职业的云计算转型之路
毫无疑问,对于那些传统IT技术--企业架构师.系统管理者.测试验收工程师或者网络工程师等开发人员骑身到云计算行业不仅是大势所趋,也能为其带来工作的保证,薪酬也更加丰厚. 如今,企业上云已经成为不可阻挡 ...
- 【EasyNetQ】- 订阅
EasyNetQ订阅者订阅消息类型(消息类的.NET类型).一旦通过调用Subscribe方法设置了对类型的订阅,就会在RabbitMQ代理上创建一个持久队列,并且该类型的任何消息都将被放置在队列中. ...
- union的代码有点难理解额
union跟位域都可以节省内存,而且union在某些地方还能起到更好看的效果? 比如: struct Matrix { union { struct { float _f11, _f12, _f13, ...
- ActiveMQ使用详解---相关概念
一.前言 公司之前使用activeMQ做过一款用于系统之间传递信息的工具,最近才正式投入生产使用,这期间出现了一些比较奇怪的问题,最终发现是没有清晰的了解activeMQ的相关配置以及一些相关概念,借 ...
- 【版本控制】VisualSVN Server更改SVN版本库存放路径的方法
最近也玩起了SVN软件版本管理,在本机上安装了VisualSVN Server+TortoiseSVN,感觉还不错吧.但是,版本库存在哪里呢?在安装VisualSVN Server时,已经默认设置了, ...