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


我使用PDFminer的pdf2text将PDF缩减为文本。不幸的是它包含特殊字符。让我从我的控制台显示输出

>>>a=pdf_to_text("ap.pdf")

下面是一个样本,有点截断

>>>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,因此它很难控制(AFAIK)。什么是正确的方法 纯文本 从这个输出?

我究竟做错了什么?

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

- 解决了答案的快速修复 - 更改编解码器删除信息 -

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


12485
2017-07-29 08:00


起源

谢谢你的回答!我是Python的初学者你可以发布一个演示代码如何使用Pdfminer,以便这个错误不适用?谢谢 - John Smith


答案:


存储非ASCII文本时经常会出现此问题 str 对象。你要做的是编码 utf-8 已经以某种编码方式编码的字符串(因为它包含上面带代码的字符 0x7f)。

要编码这样的字符串 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 命令确实如此,即它将字符串从一种编码转换为另一种编码。

一些有用的链接:


10
2017-07-29 13:06



是的,这很接近完美!我得到了一些文物,比如“......вÐ,ÑšDeliveringCusto..”但是这是一个由业余爱好者制作的最大浮华的PDF。清洁PDF文件已经过彻底解析。 - aitchnyu
不错,你需要知道你的输入编码。 - Maxim Egorushkin
我肯定会把它写成 a.decode('cp1250').encode('utf-8')。 - Jan Hudec
@JanHudec我用两行来拼写它以便能够发表评论,即仅仅为了阐明清晰度。 - Maxim Egorushkin
@aitchnyu什么是PDFMiner编码 - cp1250? - jtlz2