在使用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の記事一覧を取得しようとして躓いた話。 – あれこれふける
广告
将在 10 秒后关闭
bannerAds