我正在使用python3
,urllib3
和tika-server-1.13
来获取不同类型文件的文字。这是我的python代码:
def get_text(self, input_file_path, text_output_path, content_type):
global config
headers = util.make_headers()
mime_type = ContentType.get_mime_type(content_type)
if mime_type != '':
headers['Content-Type'] = mime_type
with open(input_file_path, "rb") as input_file:
fields = {
'file': (os.path.basename(input_file_path), input_file.read(), mime_type)
}
retry_count = 0
while retry_count < int(config.get("Tika", "RetriesCount")):
response = self.pool.request('PUT', '/tika', headers=headers, fields=fields)
if response.status == 200:
data = response.data.decode('utf-8')
text = re.sub("[\[][^\]]+[\]]", "", data)
final_text = re.sub("(\n(\t\r )*\n)+", "\n\n", text)
with open(text_output_path, "w+") as output_file:
output_file.write(final_text)
break
else:
if retry_count == (int(config.get("Tika", "RetriesCount")) - 1):
return False
retry_count += 1
return True
此代码适用于html文件,但是当我尝试解析docx文件中的文本时,它不起作用。
我从服务器返回Http错误代码422: Unprocessable Entity
使用tika-server
documentation我尝试使用curl
检查它是否适用:
curl -X PUT --data-binary @test.docx http://localhost:9998/tika --header "Content-type: application/vnd.openxmlformats-officedocument.wordprocessingml.document"
它有效。
422 Unprocessable Entity - 不支持的mime类型,加密文档&amp;等等
这是正确的mime类型(也用tika的检测系统检查过),它是受支持的,文件没有加密。
我认为这与我如何将文件上传到tika服务器有关,我做错了什么?
答案 0 :(得分:2)
您未以相同方式上传数据。 curl中的--data-binary
只是按原样上传二进制数据。没有编码。在urllib3中,使用fields
会导致urllib3生成multipart/form-encoded
消息。最重要的是,您要防止urllib3在请求中正确设置该标头,以便Tika能够理解它。要么停止更新headers['Content-Type']
,要么只是通过body=input_file.read()
。
答案 1 :(得分:0)
我相信通过将tika-python模块与仅客户模式一起使用,您可以更轻松地完成这项工作。
如果你仍然坚持要推出自己的客户端,也许这个模块的源代码中有一些线索可以显示他如何处理所有这些不同的mime类型...如果你遇到*.docx
的问题你可能会遇到别人的问题。