写技术博客主要就是总结和交流的,如果文章用错,请指正啊!

以前一直在使用SGMLParser,这个太费时间和精力了,现在为了毕业设计,改用BeautifulSoup来实现HTML页面的解析工作的。

一、字符的编码和解码

  和网页打交道,首先解决的就是web页面的编码方式,不幸的是不同网站的页面编码方式基本不相同,有的是gb2312,有的是utf-8,有的是gbk,下面是我查看我以后需要的网站源码后得出的web页面的编码方式:

di = { 'gb2312':['http://www.sina.com.cn','http://www.people.com.cn/','http://www.people.com.cn/'
,'http://www.163.com/','http://www.qq.com/'],
'gbk':['http://www.sohu.com'],
'utf-8':['http://www.huanqiu.com/','http://www.xinhuanet.com/']
}

  这个python字典,我会一直手动更新的。为什么需要手动更新呢?因为我不会动态的检测web页面的编码方式,虽然说HTTP的Header中有content的编码方式,即Content-Type这一项,但是上面的网站基本上都没有在Content-Type中表明编码方式,翻墙看了一下谷歌,youtube和facebook,在Content-Type里面都表明了编码方式,一般都为utf-8。

  知道了编码方式,就要解码了,因为BeautifulSoup先将html页面全部转码为unicode的,所以在将html页面传入BeautifulSoup中的时候,先解码,如果html的字符编码为gb2312:

response = urllib2.urlopen(url).read().decode('gb2312','ignore')
bs = BeautifulSoup(response)

  如果你想将unicode字符编码为特定的编码方式:  

response = urllib2.urlopen(url).read().decode('gb2312','ignore').encode('utf-8')

  因为业务场景不一样,我只需要抓取部分网站的页面,所以我手动查看了上面几个网站的编码方式。当然有其它的方法了,见我在stackoverflow上的提问:http://stackoverflow.com/questions/28184863/how-to-decode-and-encode-web-page-with-python 。

二、解压

很多网站为了减少流量,将页面压缩。常见的压缩方式为gzip,随便百度一下就可以收到解压gzip文件的代码:

def unzip(data):
import gzip
import StringIO
data = StringIO.StringIO(data)
gz = gzip.GzipFile(fileobj=data)
data = gz.read()
gz.close()
return data

其它的压缩方式暂不讨论。

三、一个很丑陋的demo

# -*- coding: utf-8 -*-
'''
Created on 2015年1月28日 @author: zhang
'''
from bs4 import BeautifulSoup result = {}
key_word = u'李克强' def unzip(data):
import gzip
import StringIO
data = StringIO.StringIO(data)
gz = gzip.GzipFile(fileobj=data)
data = gz.read()
gz.close()
return data def init_bs(url,encoding):
import urllib2
html_doc = ''
respone = urllib2.urlopen(url)
header = respone.info() if 'Content-Encoding' in header:
if header['Content-Encoding'] == 'gzip': html_doc = unzip(respone.read()).decode(encoding,'ignore')
else:
pass
else:
html_doc = respone.read().decode(encoding,'ignore')
return(BeautifulSoup(html_doc)) def get_target(soup):
for link in soup.find_all('a'):
text = link.get_text()
if text.find(key_word) != -1:
result[link.get('href')] = text di = { 'gb2312':['http://www.sina.com.cn','http://www.people.com.cn/','http://www.people.com.cn/'
,'http://www.163.com/','http://www.qq.com/'],
'gbk':['http://www.sohu.com'],
'utf-8':['http://www.huanqiu.com/','http://www.xinhuanet.com/']
} for k,v in di.iteritems():
for url in v: soup = init_bs(url,'gb2312')
get_target(soup) for k,v in result.iteritems():
print k,v

  

Python学习 - 使用BeautifulSoup来解析网页一:基础入门的更多相关文章

  1. Python学习笔记之爬取网页保存到本地文件

     爬虫的操作步骤: 爬虫三步走 爬虫第一步:使用requests获得数据: (request库需要提前安装,通过pip方式,参考之前的博文) 1.导入requests 2.使用requests.get ...

  2. python学习(25) BeautifulSoup介绍和实战

    BeautifulSoup是python的html解析库,处理html非常方便 BeautifulSoup 安装 pip install beautifulsoup4 BeautifulSoup 配合 ...

  3. python学习之----BeautifulSoup的find()和findAll()及四大对象

    BeautifulSoup 里的find() 和findAll() 可能是你最常用的两个函数.借助它们,你可以通 过标签的不同属性轻松地过滤HTML 页面,查找需要的标签组或单个标签. 这两个函数非常 ...

  4. python学习笔记——爬虫中提取网页中的信息

    1 数据类型 网页中的数据类型可分为结构化数据.半结构化数据.非结构化数据三种 1.1 结构化数据 常见的是MySQL,表现为二维形式的数据 1.2 半结构化数据 是结构化数据的一种形式,并不符合关系 ...

  5. python学习之BeautifulSoup模块爬图

    BeautifulSoup模块爬图学习HTML文本解析标签定位网上教程多是爬mzitu,此网站反爬限制多了.随意找了个网址,解析速度有些慢.脚本流程:首页获取总页数-->拼接每页URL--> ...

  6. 使用BeautifulSoup高效解析网页,再也不用担心睡不着觉了

    BeautifulSoup是一个可以从 HTML 或 XML 文件中提取数据的 Python 库 那需要怎么使用呢? 首先我们要安装一下这个库 1.pip install beautifulsoup4 ...

  7. python学习-迭代器,列表解析和列表生成式

    迭代器为类序列对象提供了一个类序列的接口.Python 的迭代无缝的支持序列对象,而且还允许程序猿迭代非序列类型,包括用户定义的对象. 迭代器是一个next()方法的对象,而不是通过索引计数.当需要下 ...

  8. Python学习笔记之参数解析

    python提供了两种方法进行命令行的参数解析,分别是getopt和optparse类中的模块OptionParser,下面分别详细了解这两个模块: 1.getopt模块 首先复习C语言的命令行解析: ...

  9. Python学习---xml文件的解析[beautifulsoup4模块学习]

    1.1. 安装beautifulsoup4 pip install beautifulsoup4 [更多参考]https://blog.csdn.net/sunhuaqiang1/article/de ...

随机推荐

  1. Properties/Property文件读取(键值均)乱码问题!

    方法一:使用native2ascii进行转码,这个不做说明,客户不可能帮你转码的. 方法二:当键是因为时直接getProperty即可,但加载后的propertis对象里的键也是中文乱码,就无法通过g ...

  2. ural 1106. Two Teams 二分图染色

    链接:http://acm.timus.ru/problem.aspx?space=1&num=1106 描述:有n(n<=100)个人,每个人有一个或多个朋友(朋友关系是相互的).将其 ...

  3. 390. Elimination Game

    正规解法直接跳到代码上面一点的部分就可以了.但我想记录下自己的思考和尝试过程,希望二刷能看到问题所在. 找规律的时候写了好多,虽然规律很简单. 只要随便写3以上的例子,就应该发现,相邻的2个最后结果是 ...

  4. 关于python写GUI桌面应用的一些研究结果

    研究了一下python开发GUI桌面应用的解决方案,研究结果记录如下: EasyGui:控件极为简单,连个基本的grid.list组件都没有,不适合商用,甚至是普通的应用都不行,放弃! Tkinter ...

  5. (二)windows下安装PHPCMS V9

    一.准备工作 搭建环境 :参考:Windows下搭建PHP开发环境及相关注意事项 PHPCMS V9 :下载适合自己 PHPCMS V9 版本到本地或服务器,下载地址:http://www.phpcm ...

  6. Python安装scipy

    1.下载numpy+mkl 下载链接:http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy 2.下载scipy 下载链接:http://www.lfd.uc ...

  7. poj 2240 Arbitrage (Floyd)

    链接:poj 2240 题意:首先给出N中货币,然后给出了这N种货币之间的兑换的兑换率. 如 USDollar 0.5 BritishPound 表示 :1 USDollar兑换成0.5 Britis ...

  8. android4.0 禁止横竖屏切换使用 android:configChanges="orientation|keyboardHidden"无效的解决方法

    Android横竖屏幕切换时注意4.0以上配置configChanges要加上screenSize,要不还会调用onCreate(). <activity android:name=" ...

  9. Swift 表视图动画教程: Drop-In Cards

    http://www.raywenderlich.com/76024/swift-table-view-animations-tutorial-drop-cards 标准 table view 是一个 ...

  10. Android制作粒子爆炸特效

    简介 最近在闲逛的时候,发现了一款粒子爆炸特效的控件,觉得比较有意思,效果也不错. 但是代码不好扩展,也就是说如果要提供不同的爆炸效果,需要修改的地方比较多.于是我对源代码进行了一些重构,将爆炸流程和 ...