V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
jianzhao123
V2EX  ›  Python

Python 百度百科爬虫结果乱码问题

  •  
  •   jianzhao123 · 2019-03-20 15:02:17 +08:00 · 2419 次点击
    这是一个创建于 2109 天前的主题,其中的信息可能已经有所发展或是发生改变。

    楼主 python 学的不是很深,仿照网上实例,写了个爬虫 结果输出的好多乱码,也不是很清楚,target="_blank"后面这类属于什么编码,希望有了解的朋友指点下,谢谢:) AKJ5FO.png

    13 条回复    2019-03-20 16:30:37 +08:00
    xiri
        1
    xiri  
       2019-03-20 15:14:19 +08:00 via Android   ❤️ 1
    额,一般不是全转 utf-8 就可以了吗?
    jianzhao123
        2
    jianzhao123  
    OP
       2019-03-20 15:18:01 +08:00
    @xiri 貌似不行啊,Python3.X 源码文件默认使用 utf-8 编码的
    codechaser
        3
    codechaser  
       2019-03-20 15:19:26 +08:00 via Android   ❤️ 1
    @jianzhao123 至少把相关代码贴一下吧?看这个好像就是解码的问题
    holajamc
        4
    holajamc  
       2019-03-20 15:23:59 +08:00   ❤️ 1
    In [1]: import requests

    In [2]: url = 'https://baike.baidu.com/item/Python/407313'

    In [3]: headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebK
    ...: it/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36'}

    In [4]: r = requests.get(url=url, headers=headers)

    In [5]: '计算机程序设计语言' in r.text
    Out[5]: False

    In [6]: r.encoding = 'utf8'

    In [7]: '计算机程序设计语言' in r.text
    Out[7]: True
    ipwx
        5
    ipwx  
       2019-03-20 15:24:02 +08:00   ❤️ 1
    <!DOCTYPE html>
    <!--STATUS OK-->
    <html>


    <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
    <meta name="referrer" content="always" />
    <meta name="description" content="百度百科是一部内容开放、自由的网络百科全书,旨在创造一个涵盖所有领域知识,服务所有互联网用户的中文知识性百科全书。在这里你可以参与词条编辑,分享贡献你的知识。">
    <title>百度百科_全球最大中文百科全书</title>
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
    <link rel="icon" sizes="any" mask href="//www.baidu.com/img/baidu.svg">
    ...

    ----

    所以是 UTF-8。楼主的问题不在于不会 Python,而是不会 HTML。
    xiri
        6
    xiri  
       2019-03-20 15:25:43 +08:00 via Android   ❤️ 1
    @jianzhao123 python 的源码文件用 utf-8 跟这个没关系,你抓内容都时候要解码成 utf-8。
    比如你用 requests 请求的话,要这样转一下码:
    '''
    req = requests.get(url = http........)
    req.encoding = 'utf-8'
    '''
    jianzhao123
        7
    jianzhao123  
    OP
       2019-03-20 15:27:55 +08:00
    @ipwx 楼主不是科班出身对 HTML 不是太了解,请问怎么操作呀,实在是不清楚 😂
    jianzhao123
        8
    jianzhao123  
    OP
       2019-03-20 15:29:55 +08:00
    @xiri 道行太浅,多谢指点,OK 了
    holajamc
        9
    holajamc  
       2019-03-20 15:31:37 +08:00   ❤️ 1
    @holajamc 流程大概是这样的,HTTP 的 response 合理的规范会在 Content-Type 中附带 chatset 信息,告知客户端服务端会使用什么样子的编码,比如你可以试试访问 github,看一看 response 的 headers 部分
    但是这种设想都是十分美好的事情,比如百度百科的 Content-Type 仅仅只有页面类型,因此 requests 会使用 iso-8859
    当然了也可以使用 requests 进行编码推测,这是一件开销很大的事情所以不要尝试~
    holajamc
        10
    holajamc  
       2019-03-20 15:32:44 +08:00
    @holajamc emmm chatset -> charset
    vexetron
        11
    vexetron  
       2019-03-20 15:32:50 +08:00 via iPhone
    @jianzhao123 这和科班没关系
    jianzhao123
        12
    jianzhao123  
    OP
       2019-03-20 15:36:40 +08:00
    @holajamc 明白了,谢谢
    ipwx
        13
    ipwx  
       2019-03-20 16:30:37 +08:00
    @jianzhao123 注意这行:

    <meta charset="UTF-8">
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2630 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 05:12 · PVG 13:12 · LAX 21:12 · JFK 00:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.