python wordpress xmlrpc_Python发布文章到wordpress(xml.parsers.expat.ExpatError)

一、

今天使用python-wordpress-xmlrpc的时候遇到了一个大坑,在这里记录一下。

首先通过pip install python-wordpress-xmlrpc命令安装,虽然提示:Successfully installed python-wordpress-xmlrpc-2.3,但是同时又有如下的警告信息。

distributed 1.21.8 requires msgpack, which is not installed.

twisted 17.5.0 has requirement Automat>=0.3.0, but you'll have automat 0.0.0 which is incompatible.

这个错误没有关系,继续使用。然后在向wordpress网站提交内容的时候,老是出现如下的错误:

Traceback (most recent call last):

File "test.py", line 5, in wp = Client('http://www.xxx.cc/xmlrpc.php', 'username', 'password')

File "C:\ProgramData\Anaconda3\lib\site-packages\wordpress_xmlrpc\base.py", li

ne 24, in __init__

self.supported_methods = self.server.mt.supportedMethods()

File "C:\ProgramData\Anaconda3\lib\xmlrpc\client.py", line 1112, in __call__

return self.__send(self.__name, args)

File "C:\ProgramData\Anaconda3\lib\xmlrpc\client.py", line 1452, in __request

verbose=self.__verbose

File "C:\ProgramData\Anaconda3\lib\xmlrpc\client.py", line 1154, in request

return self.single_request(host, handler, request_body, verbose)

File "C:\ProgramData\Anaconda3\lib\xmlrpc\client.py", line 1170, in single_req

uest

return self.parse_response(resp)

File "C:\ProgramData\Anaconda3\lib\xmlrpc\client.py", line 1336, in parse_resp

onse

p.feed(data)

File "C:\ProgramData\Anaconda3\lib\xmlrpc\client.py", line 439, in feed

self._parser.Parse(data, 0)

xml.parsers.expat.ExpatError: XML or text declaration not at start of entity: li

ne 2, column 0

开始以为是自己的代码问题,用官方的示例代码,同样的出错提示。

解决方案一:

后来换了一个网站试试,竟然成功了,应该不是代码的问题。

解决方案二:

怀疑是wordpress版本的问题(也许最新版本禁用了xmlrpc),下载了一个“Control XML-RPC publishing”插件,手动开启了xmlrpc,还是不行。

解决方案三:

之前在百度没有找到网上有关“xml.parsers.expat.ExpatError: XML or text declaration not at start of entity”、"C:\ProgramData\Anaconda3\lib\xmlrpc\client.py"的消息,改用google搜索。在github找到了有人碰到同样的情况。然后依上面的方法,打开C:\ProgramData\Anaconda3\Lib\xmlrpc下面的client.py文件,将其中的:

def feed(self, data):

self._parser.Parse(data, 0)

改成如下的代码:

def feed(self, data):

self._parser.Parse(data.strip(), 0)

然后再次测试,终于成功了。

附最简单的测试代码如下:

from wordpress_xmlrpc import Client, WordPressPost

from wordpress_xmlrpc.methods.posts import GetPosts, NewPost

from wordpress_xmlrpc.methods.users import GetUserInfo

wp = Client('http://www.xxx.cc/xmlrpc.php', 'username', 'passowrd')

"""

发表博文

"""

post = WordPressPost()

post.title = "this is test"

post.content = "this is content"

post.post_status = 'publish'

post.terms_names = {

'post_tag': ['test', 'firstpost'],

'category': ['test']

}

wp.call(NewPost(post))

小提示:

1、wordpress后台并没有test这个分类,python脚本可以自动建立这个分类。

2、标签也测试添加成功。

3、如果要插入文章摘要,应该用post.excerpt = article_desc,详细的用法可以看这里:

https://python-wordpress-xmlrpc.readthedocs.io/en/latest/ref/wordpress.html#wordpresspost

二、如何向子目录中插入文章?

如果要向子目录中插入文章,先建立好子目录,然后在代码中的category那里直接填子目录的名称就可以了。

post.terms_names = {

'post_tag': ['招商', '加盟'],

'category': ['child-01'],

}

三、xmlrpc更新wordpress的功能

今天试用了xmlrpc更新wordpress的功能,备忘一下。

#!/usr/bin/env python

#-*- coding: utf-8 -*-

from wordpress_xmlrpc import Client, WordPressPost, WordPressTerm

from wordpress_xmlrpc.methods.posts import GetPosts, NewPost

from wordpress_xmlrpc.methods.users import GetUserInfo

from wordpress_xmlrpc.methods import taxonomies

import csv

wp = Client('http://127.0.0.1/xmlrpc.php', 'root', '123456')

tag = WordPressTerm()

tag.taxonomy = 'category'#这里为category的话插入的是category,为post_tag的话插入的是tag

tag.name = 'My New Tag'

tag.id = wp.call(taxonomies.NewTerm(tag))

我用的是中文测试,执行python文件之后,没有任何提示,但是看wordpress博客,文章已经发布成功了,标题、内容、标签、文章分类一个也没有错。

而且它有一个功能,可以将文章的发布状态设置为“draft”,这正是我十分需要的一个功能。

真的非常方便与简单。

四、新建分类

from wordpress_xmlrpc import Client, WordPressPost

from wordpress_xmlrpc import WordPressTerm

from wordpress_xmlrpc.methods.posts import GetPosts,NewPost

from wordpress_xmlrpc.methods import taxonomies

wp = Client('http://127.0.0.1/18wp/xmlrpc.php', 'admin', '1234')

#新建分类

cat = WordPressTerm()

cat.taxonomy = 'category'

cat.name = 'cat1'#分类名称

# cat.slug = 'bieming2'#分类别名,可以忽略

cat.id = wp.call(taxonomies.NewTerm(cat))#新建分类返回的id

print("发布成功!新建设的分类ID为{}".format(cat.id))

新建子分类:

from wordpress_xmlrpc import Client, WordPressPost

from wordpress_xmlrpc import WordPressTerm

from wordpress_xmlrpc.methods import taxonomies

wp = Client('http://127.0.0.1/18wp/xmlrpc.php', 'admin', '1234')

#新建子分类

parent_cat = wp.call(taxonomies.GetTerm('category', 13))#20是父分类的id

child_cat = WordPressTerm()

child_cat.taxonomy = 'category'

child_cat.parent = parent_cat.id

child_cat.name = 'My Child Category'#分类名称

child_cat.id = wp.call(taxonomies.NewTerm(child_cat))#新建分类返回的id

print("发布成功!新建设的子分类ID为{}".format(child_cat.id))

其实第一行可以不用。

成果展示:

五、如何插入自定义字段的数据以及如何插入图片

请看这里

可以参考的网站:

http://xiaohost.com/1802.html

https://www.168seo.cn/jianzhan/wordpress/1970.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值