我无法通过wordpress_xmlrpc从python发布到我的wordpress网站,我得到ExpatError:格式不正确(无效的令牌):第1行,第222列
当我尝试运行此代码时
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
from wordpress_xmlrpc.methods.users import GetUserInfo
wp = Client('http://mysite.wordpress.com/xmlrpc.php', 'username', 'password')
我收到此错误ExpatError:格式不正确(令牌无效):第1行,第222列
答案 0 :(得分:0)
我在GitHub上回复了我,我认为,如果我们将它移出GitHub,对其他订阅者来说会更好,因为这似乎是WordPress问题。
每个最大值,这似乎是特定于您的WordPress网站的。由于我们无权访问您的网站,因此无法具体告诉您正在发生的事情。根据我们的谈话,以下是常见的故障排除提示:
- 禁用您的插件并交换为默认主题,然后尝试 连接
- 如果可以,请重新启用主题并检查
- 如果仍然有效,请重新启用1个插件并再次检查。
- 为所有插件重复步骤3。
在GitHub上,您提到即使禁用所有插件,问题仍然存在。您是否尝试过将其交换为默认值(例如WordPress 2017)并再次尝试?
我知道您不想在此处发布有关您网站的敏感信息,但是您能告诉我们一些信息吗?
希望这可以帮助我们缩小问题的范围。
答案 1 :(得分:0)
显然问题在于 Wordpress 的 XMLRPC 返回编码为 Python 称为“utf8-sig”而不是“utf8”的 XML,并且 xmlrpc.client.Transport
不检查初始 BOM,这会导致失败.
我解决了monkeypatching Transport.parse_response
的问题如下:
from xmlrpc import client
from xmlrpc.client import GzipDecodedResponse
def parse_response_(self, response):
# Monkeypatching of xmlrpc
# xmlrpc.client -> Transport.parse_response doesn't check for starting BOM
# Code lifted directly from xmlrpc.client except as noted
# read response data from httpresponse, and parse it
# Check for new http response object, otherwise it is a file object.
if hasattr(response, 'getheader'):
if response.getheader("Content-Encoding", "") == "gzip":
stream = GzipDecodedResponse(response)
else:
stream = response
else:
stream = response
p, u = self.getparser()
start = True # added
bom = b'\xef\xbb\xbf\xef\xbb\xbf' # added
while 1:
data = stream.read(1024)
if not data:
break
if self.verbose:
print("body:", repr(data))
# start addition
if start:
if data.startswith(bom):
data = data[len(bom):]
start = False
# end addition
p.feed(data)
if stream is not response:
stream.close()
p.close()
return u.close()
client.Transport.parse_response = parse_response_