新手,在学习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虽然简单,但也正是简单,我不知道哪里出错了,或者是知道错误但不知道怎么改正。
天蓬老师2017-04-17 18:00:53
元のコードのリンクは無効になっています。例として http://cpc.people.com.cn/n1/2016/0628/c404684-28502214.html の記事を使用しました。
作業コード:
リーリー実行結果:
ここで発生するエンコードの問題は非常に一般的です。簡単に言えば、リクエストが Web ページのエンコード方式を誤って推測したことです。
リクエストが応答を取得した後、取得されたデータはヘッダーで指定されたエンコーディングに従ってデコードされます。応答ヘッダーでエンコーディングが指定されていない場合、デフォルトは ISO-8859-1 (エンコーディング属性) です。幸いなことに、リクエストはコンテンツに基づいてエンコード スキームを推測することもでき、推測された結果は、People's Daily のコメントの場合は GB2312 に保存されます。したがって、encoding =parent_encoding を指定するだけでテキストを取得し、正しいデコード結果を得ることができます。 (apparent_encoding が 100% 正しいとは保証されないことに注意してください)
リクエスト ドキュメント パーツは、応答コンテンツを参照できます。
エンコーディングの理解については、「ヒューマン コンピューター インタラクションのための文字エンコーディング」および「5 分でわかる Python 文字エンコーディングの打破」を参照してください。
リクエストのエンコード分析の詳細については、「Python + リクエストのエンコードの問題」を参照してください
コーディングには確かに落とし穴がありますが、一度理解すれば、それを避けるのは簡単です。
伊谢尔伦2017-04-17 18:00:53
エラーの理由は、NoneType クラスに encode 属性がないことです。これは、soup.find_all() を使用して括弧内のパラメーターと一致しないことを意味します。まずタグを一致させてから、スタイルを一致させてください。うまくいかない場合は、正規表現
を使用してください。