新手,在学习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虽然简单,但也正是简单,我不知道哪里出错了,或者是知道错误但不知道怎么改正。
Pautan dalam kod asal tidak lagi sah saya mengambil artikel dalam http://cpc.people.com.cn/n1/2016/0628/c404684-28502214.html sebagai contoh.
Kod kerja:
Hasil jalankan:
Masalah pengekodan yang dihadapi di sini adalah sangat biasa. Ringkasnya, permintaan telah meneka kaedah pengekodan halaman web dengan salah.
Selepas permintaan mendapatkan respons, data yang diperoleh akan dinyahkodkan mengikut pengekodan yang diberikan dalam pengepala Jika pengepala respons tidak menyatakan pengekodan, lalainya ialah ISO-8859-1 (atribut pengekodan). Nasib baik, permintaan juga boleh meneka skema pengekodan berdasarkan kandungan, dan hasil tekaan disimpan dalam atribut apparent_encoding Untuk ulasan Harian Rakyat, berikut ialah GB2312. Oleh itu, anda hanya perlu menentukan pengekodan = apparent_encoding, dan kemudian dapatkan teks untuk mendapatkan hasil penyahkodan yang betul. (Perhatikan bahawa apparent_encoding tidak dijamin 100% betul)
Permintaan bahagian dokumen boleh merujuk kepada Kandungan Respons
Untuk memahami pengekodan, anda boleh merujuk kepada: Pengekodan Aksara untuk Interaksi Manusia-Komputer dan Mengalahkan Pengekodan Aksara Python dalam Lima Minit.
Untuk butiran tentang analisis pengekodan permintaan, rujuk Python Permintaan isu pengekodan
Pengekodan sememangnya satu perangkap, tetapi apabila anda memahaminya, mudah untuk mengelakkannya.
Cari elemen biasa dan kemudian gunakan ungkapan biasa untuk menapis data
Sebab ralat ialah kelas NoneType tidak mempunyai atribut pengekodan, yang bermaksud anda menggunakan soup.find_all() untuk tidak sepadan dengan parameter dalam kurungan Cuba padankan teg dahulu, dan kemudian padankan gaya . Anda mungkin mencari sebabnya. Jika ia tidak berkesan, gunakan ungkapan biasa