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

新手,在学习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

学习是最好的投资!

membalas semua(3)
Peter_Zhu

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:

#! /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

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan