在使用python-wordpress-xmlrpc获取文章列表时出现错误
当我尝试使用python-wordpress-xmlrpc从WordPress获取文章列表时遇到了一些困难。
环境
OS: Windows 11
Python環境: Anacondaで仮想環境を構築
Pythonバージョン: 3.10.4
module:
- python-wordpress-xmlrpc バージョン: 2.3
错误信息
参照以下文档,我尝试获取文章列表,但在处理collections时出现错误。
- python-wordpress-xmlrpc ドキュメント
# 必要なモジュールを持ってくる
from wordpress_xmlrpc import Client, methods
from wordpress_xmlrpc.methods.posts import GetPosts
# client情報
url = 'https://hogehoge.com/xmlrpc.php' # トップページのアドレス末尾に/xmlrpc.phpを付ける
user = 'hoge' # WordPressのユーザ名
password = 'hogehoge' # WordPressのパスワード
client = Client(url, user, password)
# 記事一覧の取得。出力はリスト型。
posts = client.call(GetPosts())
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Input In [6], in <cell line: 1>()
----> 1 posts = client.call(GetPosts())
File ~\anaconda3\envs\py310\lib\site-packages\wordpress_xmlrpc\base.py:46, in Client.call(self, method)
44 else:
45 raise
---> 46 return method.process_result(raw_result)
File ~\anaconda3\envs\py310\lib\site-packages\wordpress_xmlrpc\base.py:128, in XmlrpcMethod.process_result(self, raw_result)
126 if isinstance(raw_result, dict_type):
127 return self.results_class(raw_result)
--> 128 elif isinstance(raw_result, collections.Iterable):
129 return [self.results_class(result) for result in raw_result]
131 return raw_result
AttributeError: module 'collections' has no attribute 'Iterable'
原因和对策 hé duì cè)
错误的原因 de
由于Python版本的差异,模块collections已被替换为collections.abc,这是问题发生的原因。从Python3.8开始可能会出现这个问题。
错误处理
2022/9目前,python-wordpress-xmlrpc自2.3版本以来已有一段时间没有更新,相关错误也没有修复。
为了继续进行处理,我们将替换python-wordpress-xmlrpc中发生错误的XmlrpcMethod.process_result函数为我们自己修正过的自定义函数。
修改後的代码 de
# 修正するモジュールをインポート
from wordpress_xmlrpc.base import XmlrpcMethod
# 修正するにあたり、必要な関連モジュールをインポート
from wordpress_xmlrpc.compat import xmlrpc_client, dict_type
import collections.abc
# 元の関数をコピペして、自作関数を作成
def my_process_result(self, raw_result):
if self.results_class and raw_result:
if isinstance(raw_result, dict_type): # dict_type は wordpress_xmlrpc.compat からインポートしている
return self.results_class(raw_result)
elif isinstance(raw_result, collections.abc.Iterable): # collections => collections.abc に書き換え
return [self.results_class(result) for result in raw_result]
return raw_result
# 自作関数に置き換える。
XmlrpcMethod.process_result = my_process_result
###############################
### 以下、記事一覧取得のコード ###
###############################
from wordpress_xmlrpc import Client, methods
from wordpress_xmlrpc.methods.posts import GetPosts
# client情報
url = 'https://hogehoge.com/xmlrpc.php' # トップページのアドレス末尾に/xmlrpc.phpを付ける
user = 'hoge' # WordPressのユーザ名
password = 'hogehoge' # WordPressのパスワード
client = Client(url, user, password)
# 記事一覧の取得。出力はリスト型。
posts = client.call(GetPosts())
请引用以上内容
-
- Qiita記事
PythonでWordPressに投稿、一覧取得 – Qiita
Pythonでライブラリの処理を上書きする – Qiita
GitHub
GitHub – maxcutler/python-wordpress-xmlrpc: Python library for WordPress XML-RPC integration
fix import for py3.10 compat: collections.Iterable -> collections.abc… by foormea · Pull Request #148 · maxcutler/
collections.abc について
collections.abc — コレクションの抽象基底クラス — Python 3.10.6 ドキュメント
拼搏日志
在博客中有详细记录。
- 【python】WordPressの記事一覧を取得しようとして躓いた話。 – あれこれふける