新手,在学习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의 기사를 예로 들었습니다.
작업 코드:
으아악실행 결과:
여기서 발생하는 인코딩 문제는 매우 일반적입니다. 간단히 말해서 요청이 웹페이지의 인코딩 방법을 잘못 추측한 것입니다.
요청이 응답을 얻은 후, 얻은 데이터는 헤더에 지정된 인코딩에 따라 디코딩됩니다. 응답 헤더에 인코딩이 지정되지 않은 경우 기본값은 ISO-8859-1(인코딩 속성)입니다. 다행히도 요청은 내용을 기반으로 인코딩 체계를 추측할 수 있으며 추측된 결과는 명백한_인코딩 속성에 저장됩니다. 인민일보 댓글의 경우 GB2312입니다. 따라서 인코딩 = 명백한_인코딩을 지정한 다음 올바른 디코딩 결과를 얻으려면 텍스트를 가져오기만 하면 됩니다. (apparent_encoding이 100% 정확하다고 보장하지는 않습니다.)
요청 문서 부분은 응답 내용을 참조할 수 있습니다
인코딩에 대한 이해를 위해 다음을 참조할 수 있습니다. 인간-컴퓨터 상호 작용을 위한 문자 인코딩 및 5분 안에 Python 문자 인코딩 패배.
요청 인코딩 분석에 대한 자세한 내용은 Python + 요청 인코딩 문제를 참조하세요
코딩은 정말 함정이지만 일단 이해하고 나면 피하기가 쉽습니다.
伊谢尔伦2017-04-17 18:00:53
오류가 발생하는 이유는 NoneType 클래스에 encode 속성이 없기 때문입니다. 즉, 대괄호 안의 매개변수를 일치시키지 않기 위해 수프.find_all()을 사용했음을 의미합니다. 태그를 먼저 일치시킨 다음 스타일을 일치시키세요. .원인을 찾을 수 없으면 정규식을 사용하세요