python - 爬取人民日报的评论员文章,碰到问题了,求解答。
PHPz
PHPz 2017-04-17 17:58:53
0
3
668

新手,在学习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虽然简单,但也正是简单,我不知道哪里出错了,或者是知道错误但不知道怎么改正。

PHPz
PHPz

学习是最好的投资!

répondre à tous(3)
Peter_Zhu

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.

大家讲道理

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

伊谢尔伦

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

.
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal