前天在写央广网爬虫的时候遇到一个很奇怪的问题,就是在用xpath取数据的时候总是为空,而且数据明明就在源码上,并不是用JS传的,想了好久没想出来,后来发现是编码的问题。
python中有一个字符编码检测库叫charade,requests其实也能检测编码,不过有时候会不准确。charade还比较好用
import requests
from lxml import etree
import chardet
def test():
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0',
}
# 央广网中随意选取的一个详情页测试的url
url = 'http://news.cnr.cn/theory/gc/20180914/t20180914_524360107.shtml'
req = requests.get(url, headers=headers)
if req.status_code == 200:
res_cont = update_code(req.content)
try:
com = etree.HTML(res_cont)
except:
com = etree.HTML(req.content)
article = ''.join(com.xpath('//div[@class="TRS_Editor"]/p//text()'))
# 如果不调用下面的update_code函数,这里打印出来的会是空的
print(article)
# 可以写成一个模块,每次基本上都可以用,有的需要改成utf-8编码格式,主要看网站
def update_code(content):
try:
code_content = content.decode('gb18030', errors='ignore')
return code_content
except:
try:
return content.decode()
except:
encod = chardet.detect(content)['encoding']
return content.decode(encod)
test()
这样才可以取到数据。
网友评论