Python学习 - 使用BeautifulSoup来解析网页一:基础入门

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

以前一直在使用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中表明编码方式,FQ看了一下谷歌,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

  

时间: 2024-10-14 03:41:47

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

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

BeautifulSoup是python的html解析库,处理html非常方便 BeautifulSoup 安装 pip install beautifulsoup4 BeautifulSoup 配合的解析器 # python标准库 BeautifulSoup(html,'html.parser') #lxml HTML 解析器 BeautifulSoup(html,'lxml) #html5lib BeautifulSoup(html,'html5lib') python 标准库解析器不需要第

网页网站基础入门篇: 运行第一个网页

对于网页呢!其实入门并不难,反而要比入门C语言还简单. 后缀名字改为.html 网页不需要解释器,你自己写的代码只要按照网页的规定来写,浏览器自己去识别 现在写个最简单的... 让网页显示点东西 <html> 这是我的第一个网页 </html> 运行一下(鼠标双击) 最简单的网页就完成了 <html> 这个之间写代码</html> 有没有这个疑问 一般咱浏览器都是访问的别人的网页/网站,咱自己的怎么让别人访问呢??? 其实实现让别人访问你的网页或者网站就是让

python Beautiful Soup 抓取解析网页

Beautiful Soup is a Python library designed for quick turnaround projects like screen-scraping.总之就是一个解析xml和html之类的库,用着还算顺手. 官网地址:http://www.crummy.com/software/BeautifulSoup/ 下面来介绍下使用python和Beautiful Soup 抓取一个网页上的PM2.5数据. PM2.5 数据的网站:http://www.pm25.

python学习之----BeautifulSoup小示例

BeautifulSoup 库最常用的对象恰好就是BeautifulSoup 对象. from urllib.request import urlopen from bs4 import BeautifulSoup html = urlopen("http://www.pythonscraping.com/pages/page1.html") bsObj = BeautifulSoup(html.read()) print(bsObj.h1) bsObj.tagname只能获取页面中的

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

1 数据类型 网页中的数据类型可分为结构化数据.半结构化数据.非结构化数据三种 1.1 结构化数据 常见的是MySQL,表现为二维形式的数据 1.2 半结构化数据 是结构化数据的一种形式,并不符合关系型数据库或其他数据表的形式关联起来的数据模型结构,但包含相关标记,用来分隔语义元素以及对记录和字段进行分层.因此,它也被称为自描述的结构.常见的半结构数据有HTML,XML和JSON等,实际上是以树或者图的结构来存储的. <person> <name>A</name> &l

python学习_day04___阶段作业解析

1.执行Python脚本的两种方式 a. 运行cmd,在黑框中输入编译器地址及要运行脚本的地址 b.在pycharm中编译脚本2.简述位与字节的关系 1个字节由8个二进制数构成,即1byte=8bit3.简述asscii码.unicode.utf-8.gbk的关系 asscii(8位,未包含其他国家字符) unicode(16或32位,万国码,占内存) utf-8(8-32位,汉字24位) gbk(16位,主要为汉字)4.请写出"李杰"分别用utf-8和gbk编码所占的位数 utf-8

python学习(24) 使用Xpath解析并抓取美女图片

Xpath最初用来处理XML解析,同样适用于HTML文档处理.相比正则表达式更方便一些 Xpath基本规则 nodename 表示选取nodename 节点的所有子节点 / 表示当前节点的直接子节点 // 表示当前节点的子节点和孙子节点 . 表示当前节点 .. 当前节点的父节点 @ 选取属性 下面举例使用下 text = ''' <div class="bus_vtem"> <a href="https://www.aisinei.org/thread-17

python爬虫 selenium+phantomjs动态解析网页,加载页面成功,返回空数据

废话不多说,直接说重点: 刚开始做的时候,代理IP,头部信息池,都已经做好了,使用selenium+phantomjs获取js动态加载后的源码 起初挺好的,能出来动态加载后的源码,但是运行了几次之后,电脑有点卡顿(估计是运存太小),源码就获取不到了,返回的数据 都是空数据,以至于都是出错 在做的时候一定要给页面加载之前做一个延时,以保证页面的正常加载出来,这样我们才能获取导数据 我在加载前后都做了延时等待,当然,我这个就是说这个意思,没必要仿照 可以根据自己的需求进行设置,然后源码就加载出来了,

Python 学习之路 (一):基础

数据类型和变量 整数 在Python3中,整数可以处理任意大小的整数,不分长整型和整型, 十六进制用0x开头或者H结尾表示:0x2af ,2afH 用函数 int() 来转换字符串中的数字,里面不能包含除数字以外的字符,例如 int('123') 浮点数 浮点数也就是小数,除了数学表示法表示外,较大的浮点数用科学计数法表示:1.23e9 ,1.2e-4 用函数 float() 来转换字符串中的浮点数,如果字符串里是整数,也会被转换成浮点数,字符串中可以是科学计数法,例如 float('2.24e