Source code for zhihu.models.answer
# encoding: utf-8
import re
try:
from urllib.parse import urlparse
except:
from urlparse import urlparse
import os
import requests
from bs4 import BeautifulSoup
from ..auth import need_login
from ..error import ZhihuError
from . import Model
from ..url import URL
[docs]class Answer(Model):
def __init__(self, id=None, url=None):
id = id if id is not None else self._extract_id(url)
if not id:
raise ZhihuError("没有指定回答的id或者url")
self.id = str(id)
self.url = url
super(Answer, self).__init__()
@staticmethod
def _extract_id(url):
"""
从url中提取目标id
"""
pattern = re.compile("https://www.zhihu.com/question/\d+/answer/([\w-]+)")
match = pattern.search(url)
return match.group(1) if match else None
@need_login
def vote_up(self, **kwargs):
"""
赞同
"""
r = self._execute(url=URL.vote_up(self.id), data={"type": "up"}, **kwargs)
if r.ok:
return r.json()
else:
raise ZhihuError("操作失败:%s" % r.text)
@need_login
def vote_down(self, **kwargs):
"""
反对
"""
r = self._execute(url=URL.vote_down(self.id), data={"type": "down"}, **kwargs)
if r.ok:
return r.json()
else:
raise ZhihuError("操作失败:%s" % r.text)
@need_login
def vote_neutral(self, **kwargs):
"""
中立
"""
r = self._execute(url=URL.vote_neutral(self.id), data={"type": "neutral"}, **kwargs)
if r.ok:
return r.json()
else:
raise ZhihuError("操作失败:%s" % r.text)
@need_login
def thank(self, **kwargs):
"""
感谢
"""
r = self._execute(url=URL.thank(self.id), **kwargs)
if r.ok:
return r.json()
else:
raise ZhihuError("操作失败:%s" % r.text)
@need_login
def thank_cancel(self, **kwargs):
"""
感谢取消
"""
r = self._execute(method="delete", url=URL.thank_cancel(self.id), **kwargs)
if r.ok:
return r.json()
else:
raise ZhihuError("操作失败:%s" % r.text)
@need_login
def nothelp(self, **kwargs):
"""
没有帮助
"""
r = self._execute(url=URL.nothelp(self.id), **kwargs)
if r.ok:
return r.json()
else:
raise ZhihuError("操作失败:%s" % r.text)
@need_login
def nothelp_cancel(self, **kwargs):
"""
撤销没有帮助
"""
r = self._execute(method="delete", url=URL.nothelp_cancel(self.id), **kwargs)
if r.ok:
return r.json()
else:
raise ZhihuError("操作失败:%s" % r.text)
[docs] def images(self, path="."):
"""
提取回答中的图片
:param path 保存路径
"""
assert self.url, "必须指定URL"
r = self._execute(method='get', url=self.url)
soup = BeautifulSoup(r.text, 'lxml')
content_tag = soup.find('div', class_="RichContent-inner")
images = content_tag.find_all("img")
result = []
for i in images:
url = i['src']
if url.startswith("http"):
filename = urlparse(url).path[1:]
filename = os.path.join(path, filename)
with open(filename, 'wb') as fd:
r = requests.get(url)
for chunk in r.iter_content(chunk_size=128):
fd.write(chunk)
result.append(filename)
return result