Home >  > Python发布文章到wordpress(xml.parsers.expat.ExpatError)

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

0

一、
今天使用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

本文暂无标签

发表评论

*

*