recherche

Maison  >  Questions et réponses  >  le corps du texte

python - 爬取人民日报的评论员文章,碰到问题了,求解答。

新手,在学习python爬虫,环境是python3.4,想爬取人民日报评论员文章,现在只怕去了一个网页,代码如下,

import requests
from bs4 import BeautifulSoup
import re

myUrl = "http://cpc.people.com.cn/pinglun/n1/201/0613/c78779-28428425.html"
response = requests.get(myUrl)
soup = BeautifulSoup(response.text, "lxml", from_encoding="gbk")
print(soup.title.string.encode('ISO-8859-1').decode('gbk'))

for a in soup.find_all(style="text-indent: 2em;"):
    print(a.string.encode('ISO-8859-1').decode('gbk'))

网页上出错的源代码如下:
<span style="text-indent: 2em; display: block;" id="paper_num">《 人民日报 》( 2016年06月13日 01 版)</span>
我的出错提示如下:
Traceback (most recent call last):
File "pa_chong_lx.py", line 21, in <module>

print(a.string.encode('ISO-8859-1').decode('gbk'))

AttributeError: 'NoneType' object has no attribute 'encode'
原因分析:
我查找的关键词是style="text-indent: 2em;,这段代码<span style="text-indent: 2em; display: block;" id="paper_num">《 人民日报 》( 2016年06月13日 01 版)</span> 格式与前边的主题文章代码不一样,所以出错,求解答怎么改。

新手,因为编码的问题卡了好久,感觉一步一个坑,步步是坑!python虽然简单,但也正是简单,我不知道哪里出错了,或者是知道错误但不知道怎么改正。

PHPzPHPz2890 Il y a quelques jours676

répondre à tous(3)je répondrai

  • 天蓬老师

    天蓬老师2017-04-17 18:00:53

    Le lien dans le code d'origine n'est plus valide. J'ai utilisé l'article de http://cpc.people.com.cn/n1/2016/0628/c404684-28502214.html comme exemple.

    Code de travail :

    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Last Modified time: 2016-06-30 12:32:52
    
    import requests
    from bs4 import BeautifulSoup
    
    
    myUrl = "http://cpc.people.com.cn/n1/2016/0628/c404684-28502214.html"
    response = requests.get(myUrl)
    
    response.encoding = response.apparent_encoding
    
    soup = BeautifulSoup(response.text)
    print soup.title.string
    
    for a in soup.find_all(style="text-indent: 2em;"):
        if a.string:
            print a.string
    

    Résultat de l'exécution :

    Le problème d'encodage rencontré ici est très courant. En termes simples, les requêtes ont mal deviné la méthode d'encodage de la page Web.

    Une fois que les requêtes ont obtenu la réponse, les données obtenues seront décodées selon le codage donné dans les en-têtes. Si l'en-tête de réponse ne spécifie pas de codage, la valeur par défaut est ISO-8859-1 (attribut de codage). Heureusement, les requêtes peuvent également deviner le schéma de codage en fonction du contenu, et le résultat deviné est stocké dans l'attribut apparent_encoding. Pour les commentaires du People's Daily, voici GB2312. Par conséquent, il vous suffit de spécifier encoding = apparent_encoding, puis d'obtenir le texte pour obtenir le résultat de décodage correct. (Notez qu'apparent_encoding n'est pas garanti comme étant correct à 100 %)

    La partie du document Demandes peut faire référence au contenu de la réponse
    Pour comprendre le codage, vous pouvez vous référer à : Encodage de caractères pour l'interaction homme-machine et Vaincre l'encodage de caractères Python en cinq minutes.
    Pour plus de détails sur l'analyse de l'encodage des requêtes, veuillez vous référer à Python Problèmes d'encodage des requêtes

    Le codage est effectivement un écueil, mais une fois qu’on l’a compris, il est facile de l’éviter.

    répondre
    0
  • 大家讲道理

    大家讲道理2017-04-17 18:00:53

    Trouvez un élément commun puis utilisez des expressions régulières pour filtrer les données

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 18:00:53

    La raison de l'erreur est que la classe NoneType n'a pas d'attribut encode, ce qui signifie que vous avez utilisé soup.find_all() pour ne pas faire correspondre les paramètres entre parenthèses. Essayez d'abord de faire correspondre la balise, puis de faire correspondre le style. . Vous trouverez peut-être la raison. Si cela ne fonctionne pas, utilisez des expressions régulières

    .

    répondre
    0
  • Annulerrépondre