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

ython发布文章到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文件,将其中的:

1 def feed(self, data):
2         self._parser.Parse(data, 0)

改成如下的代码:

1 def feed(self, data):
2         self._parser.Parse(data.strip(), 0)

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

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

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

1 from wordpress_xmlrpc import Client, WordPressPost
2 from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
3 from wordpress_xmlrpc.methods.users import GetUserInfo
4
5 wp = Client('http://www.xxx.cc/xmlrpc.php', 'username', 'passowrd')
6 """
7 发表博文
8 """
9 post = WordPressPost()
10 post.title = "this is test"
11 post.content = "this is content"
12 post.post_status = 'publish'
13 post.terms_names = {
14     'post_tag': ['test', 'firstpost'],
15     'category': ['test']
16 }
17
18 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那里直接填子目录的名称就可以了。

1 post.terms_names = {
2     'post_tag': ['招商', '加盟'],
3     'category': ['child-01'],
4 }

三、xmlrpc更新wordpress的功能

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

1 #!/usr/bin/env python
2 #-*- coding: utf-8 -*-
3
4 from wordpress_xmlrpc import Client, WordPressPost, WordPressTerm
5 from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
6 from wordpress_xmlrpc.methods.users import GetUserInfo
7 from wordpress_xmlrpc.methods import taxonomies
8 import csv
9
10
11 wp = Client('http://127.0.0.1/xmlrpc.php', 'root', '123456')
12
13 tag = WordPressTerm()
14 tag.taxonomy = 'category'#这里为category的话插入的是category,为post_tag的话插入的是tag
15 tag.name = 'My New Tag'
16 tag.id = wp.call(taxonomies.NewTerm(tag))

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

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

真的非常方便与简单。

四、新建分类

1 from wordpress_xmlrpc import Client, WordPressPost
2 from wordpress_xmlrpc import WordPressTerm
3 from wordpress_xmlrpc.methods.posts import GetPosts,NewPost
4 from wordpress_xmlrpc.methods import taxonomies
5 wp = Client('http://127.0.0.1/18wp/xmlrpc.php', 'admin', '1234')
6
7
8 #新建分类
9 cat = WordPressTerm()
10 cat.taxonomy = 'category'
11 cat.name = 'cat1'#分类名称
12 # cat.slug = 'bieming2'#分类别名,可以忽略
13 cat.id = wp.call(taxonomies.NewTerm(cat))#新建分类返回的id
14 print("发布成功!新建设的分类ID为{}".format(cat.id))

新建子分类:

1 from wordpress_xmlrpc import Client, WordPressPost
2 from wordpress_xmlrpc import WordPressTerm
3 from wordpress_xmlrpc.methods import taxonomies
4 wp = Client('http://127.0.0.1/18wp/xmlrpc.php', 'admin', '1234')
5
6
7 #新建子分类
8 parent_cat = wp.call(taxonomies.GetTerm('category', 13))#20是父分类的id
9  
10 child_cat = WordPressTerm()
11 child_cat.taxonomy = 'category'
12 child_cat.parent = parent_cat.id
13 child_cat.name = 'My Child Category'#分类名称
14 child_cat.id = wp.call(taxonomies.NewTerm(child_cat))#新建分类返回的id
15 print("发布成功!新建设的子分类ID为{}".format(child_cat.id))

其实第一行可以不用。
成果展示:

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

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

可以参考的网站:

http://xiaohost.com/1802.html

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

本文暂无标签

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注