专栏首页python3python3 urllib 爬虫乱码问

python3 urllib 爬虫乱码问

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from bs4 import BeautifulSoup
from urllib.request import urlopen

baseUrl = 'http://www.51bengou.com'


def getCover(articleUrl):
    global baseUrl
    html = urlopen(baseUrl+articleUrl).read()
    bsObj = BeautifulSoup(html, 'lxml')
    try:
        # Find internal link of the cover.
        src = bsObj.find('div', {'class': 'cartoon-intro'}).find('img')['src']
        return src
    except AttributeError:
        return None


def getInfo(articleUrl):
    global baseUrl
    html = urlopen(baseUrl+articleUrl)
    bsObj = BeautifulSoup(html, 'lxml')
    try:
        # Find all information.
        infos = bsObj.find('div', {'class': 'cartoon-intro'}).findAll('p', {'class': False})
        items = {}
        # Store in a dict.
        for info in infos[:7]:
            items[info.span.text] = info.text
        return list(items)
    except AttributeError:
        return None


print(getInfo('/cartoon/HuoYingRenZhe/'))

如上程序是一个基于笨狗漫画网的爬虫程序,运行后,发现得到的漫画基本信息输出为乱码。

<meta charset="gb2312">

经查看网页源码发现,这个网页使用了gb2312编码。经我目前学习的编码知识,在程序读取网页时,BeautifulSoup使用了默认的utf-8编码将gb2312编码的字节字符串解码为了Unicode。此时,就出现了乱码,并且可能因为对错误的忽略或者替代,信息已经发生了丢失。

为了解决这个问题,我们应该在使用BeautifulSoup之前,对urlopen得到的对象进行读取,然后使用gb2312编码进行解码,此时问题应该就解决了。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from bs4 import BeautifulSoup
from urllib.request import urlopen

baseUrl = 'http://www.51bengou.com'


def getCover(articleUrl):
    global baseUrl
    html = urlopen(baseUrl+articleUrl).read().decode('gb2312', 'replace')
    bsObj = BeautifulSoup(html, 'lxml')
    try:
        # Find internal link of the cover.
        src = bsObj.find('div', {'class': 'cartoon-intro'}).find('img')['src']
        return src
    except AttributeError:
        return None


def getInfo(articleUrl):
    global baseUrl
    html = urlopen(baseUrl+articleUrl).read().decode('gb2312', 'replace')
    bsObj = BeautifulSoup(html, 'lxml')
    print(html)
    try:
        # Find all information.
        infos = bsObj.find('div', {'class': 'cartoon-intro'}).findAll('p', {'class': False})
        items = {}
        # Store in a dict.
        for info in infos[:7]:
            items[info.span.text] = info.text
        return list(items)
    except AttributeError:
        return None


print(getInfo('/cartoon/HuoYingRenZhe/'))

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Reuqests-html教程

    最近爬虫遇到的情况是,爬取的网站使用JavaScript渲染的,网站爬取的结果只有一堆JS代码。之前遇到这种情况的处理办法是用Splash(一般是配合Scrap...

    py3study
  • Python之模块介绍

    os.makedirs('dirname1/dirname2')  可生成多层递归目录

    py3study
  • Python——教你画朵太阳花

    6、然后在Edit中找到Save As,保存文件(或者直接按Ctrl+Shift+S)

    py3study
  • 面试被问频率最高的几道Redis面试题

    Redis相关面试题确实很多,主要是因为知识点很多,但是面试的时候,不可能都问个遍,所以本文就来总结一下,面试被问频率最高的几道Redis的面试题。

    用户4143945
  • 23种设计模式之工厂三兄弟

    关于设计模式,是一个永远说不完的也说不清的话题。毕竟在编程的世界里,没有最好的设计模式,只有最合适的设计模式。甚至有些时候,程序或者问题不到一定的规模,尝试所有...

    VV木公子
  • 多重假设检验的三种常见方法计算

    一般来说,当p.value < 0.05时,我们认为犯错误的概率很低,可以否定原假设。但是假如我们做了很多次实验,比如10000次,那么犯错误的次数可能能达到5...

    生信编程日常
  • webservice的一些问题

    所谓跨编程语言和跨操作平台,就是说服务端程序采用Java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不...

    技术从心
  • Redis 真得那么好用吗?

    Redis是一个开源的底层使用C语言编写的Key-Value存储数据库。可用于缓存、事件发布订阅、高速队列等场景。而且支持丰富的数据类型:string(字符串)...

    猿哥
  • Vue系列(七)—— 从零开始搭建基于Webpack的Vue项目

    Hello小伙伴们,Vue也写了好几篇了,今天说点更实用的,今天我们就要来聊聊怎样能够快速搭建一个Vue的程序呢?这里我们可以基于Webpack去搭建,下面我们...

    萌兔IT
  • 缓存雪崩、击穿、穿透,该如何避免?

    帅气迷人的面试官您好,我了解的,目前电商首页以及热点数据都会去做缓存 ,一般缓存都是定时任务去刷新,或者是查不到之后去更新的,定时任务刷新就有一个问题。

    黄泽杰

扫码关注云+社区

领取腾讯云代金券