Python: 特殊字符给我带来了问题(来自PDFminer)

12
我使用PDFminer中的pdf2text将PDF文件转换为文本。不幸的是,它包含特殊字符。请看控制台输出:
>>>a=pdf_to_text("ap.pdf")

这是一个关于IT技术的示例,以下是部分内容:

这里是一个简短的截断示例

>>>a[5000:5500]
'f one architect. Decades ...... but to re\xef\xac\x82ect\none set of design ideas, than to have one that contains many\ngood but independent and uncoordinated ideas.\n1 Joshua Bloch, \xe2\x80\x9cHow to Design a Good API and Why It Matters\xe2\x80\x9d, G......=-3733'

我理解我必须对其进行编码。
>>>a[5000:5500].encode('utf-8')
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 237: ordinal not in range(128)

我搜索了一下并尝试了它们,特别是在Python中替换特殊字符。输入来自PDFminer,所以很难(据我所知)进行控制。怎样才能从这个输出中生成适当的纯文本

我做错了什么吗?

--一个快速解决方案:将PDFminer的编解码器更改为ascii,但这不是一个持久的解决方案--

--放弃了快速修复答案-更改编解码器会删除信息--

--一个相关的话题,由Maxim提到:http://en.wikipedia.org/wiki/Windows-1251--


谢谢您的提问!我是Python的初学者,您能否发布一份演示代码,以便我使用Pdfminer时不会出现这些错误?谢谢。 - John Smith
1个回答

12

当非ASCII文本存储在str对象中时,经常会出现此问题。您尝试的是在已经编码为某种编码(因为它包含代码高于0x7f的字符)的字符串中进行utf-8编码。

要在utf-8中对这样的字符串进行编码,必须首先对其进行解码。假设原始文本编码为cp1251(用实际编码替换它),类似以下内容的东西就可以解决问题:

u = s.decode('cp1251')  # decode from cp1251 byte (str) string to unicode string
s = u.encode('utf-8')   # re-encode unicode string to  utf-8 byte (str) string

基本上,上述代码片段所做的就是 iconv --from-code=CP1251 --to-code=UTF-8 命令所做的事情,即将字符串从一种编码转换为另一种编码。

一些有用的链接:


是的,这个几乎完美地工作了!我得到了一些像“...“Delivering Custo..”这样的留存物,但那是业余人士为了最大程度的表现而制作的PDF文件。更干净的PDF可以被干净地解析。 - Jesvin Jose
不错,你需要知道你的输入编码。 - Maxim Egorushkin
我一定会将它写成 a.decode('cp1250').encode('utf-8') - Jan Hudec
@JanHudec 我将其分成两行来注释,以便能够添加注释,即仅为了表述的清晰明了。 - Maxim Egorushkin
@aitchnyu PDFMiner 的编码是什么 - cp1250? - jtlz2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接