MENU

使用Python3+Camelot+Pdfplumber+Centos8 解析pdf表格过程中的问题

April 26, 2021 • 数据采集与数据分析(python)

环境:
系统:Centos8 Python3版本:3.9.2 Camelot-py库的版本:0.57

在Centos8环境下遇到的问题

  • Centos下运行程序报错ModuleNotFoundError: No module named '_sqlite3'

报这个错误的原因是Centos没有安装sqlite-devel库

dnf install sqlite-devel

安装后运行程序发现让然报错。后来发现sqlite-devel需要在编译python之前安装,那么好吧,接下来重新编译python3

cd /usr/local/lib/python3.x
.configure --prefix=/usr/local/lib/
make&make install

再次运行程序,就不会出现报错了~


  • Centos下运行程序报错ModuleNotFoundError: No module named '_bz2'

出现这种错误的原因一般是由于python3的lib-dynload中缺少 _bz2.cpython-38-x86_64-linux-gnu.so这个动态链接库
造成这种情况很有可能是:后期在系统中安装了其他或更高的python版本所导致。解决办法就是将系统中原有的那个python链接库复制到新版本的里面来就可以。那么开始操作。(没有的可以下载我这个~)
_bz2.cpython-36m-x86_64-linux-gnu.so
将这个so文件放入/usr/local/lib/python3.x/lib-dynload/文件夹下,并改名为_bz2.cpython-3[Xm]-x86_64-linux-gnu.so
这里注意中括号里的变量X和m字符,X表示你的python版本,m的意思是:3.9以下版本必须添加m,3.9及以上版本无需m。
如果使用的是我的文件,请设置好执行权限

chmod +x _bz2.cpython-39-x86_64-linux-gnu.so

接下来运行程序,已无报错!

到目前为止,由于Centos8环境所造成的问题,只发现这2个,后续出现还会更新~

使用pdfplumer带来的问题

  • 解析中文pdf时会遇到报错 pdfminer.psparser.SyntaxError: Invalid dictionary construct: [/'Type', /'Font', /'Subtype', /'Type0', /'BaseFont', /b"b'", /"ABCDEE+\xcb\xce\xcc\xe5'", /'Encoding', /'Identity-H', /'DescendantFonts', <PDFObjRef:11>, /'ToUnicode', <PDFObjRef:19>]

报错的原因是pdfplumer底层使用的是PyPDF2库,然而它对中文的支持较差,所以才会出现‘Invalid dictionary construct’这个问题。解决办法是修改库的源码(添加对中文字符串gbk的支持),操作如下:

  1. 找到文件D:projectsmyprojectvenvlibsite-packagesPyPDF2generic.py",
    该文件的第484行(如果项目文件夹下没有,可能在python库中如/usr/local/lib/python3.9/site-packages下)

将原本这样的


try:
    return NameObject(name.decode('utf-8'))
except (UnicodeEncodeError, UnicodeDecodeError) as e:
        if not pdf.strict:
            warnings.warn("Illegal character in Name Object", utils.PdfReadWarning)
            return NameObject(name)
        else:
            raise utils.PdfReadError("Illegal character in Name Object")

改为(添加对gbk的解码):

try:
    return NameObject(name.decode('utf-8'))
except (UnicodeEncodeError, UnicodeDecodeError) as e:
    try:                                        #添加的
        return NameObject(name.decode('gbk'))   #添加的
    except (UnicodeEncodeError, UnicodeDecodeError) as e: #添加的
        if not pdf.strict:
            warnings.warn("Illegal character in Name Object", utils.PdfReadWarning)
            return NameObject(name)
        else:
            raise utils.PdfReadError("Illegal character in Name Object")

运行程序发现,让然报错,继续追溯修改~
找到文件D:projectsmyprojectvenvlibsite-packagesPyPDF2utils.py",第238行(如果项目文件夹下没有,方法同上).
将原本这样的

   

 r = s.encode('latin-1')
    if len(s) < 2:
        bc[s] = r
    return r

改为(原理同上)
try:

        r = s.encode('latin-1')
    except Exception as e:
        r = s.encode('utf-8')
    if len(s) < 2:
        bc[s] = r
    return r

改好后再运行,发现之前的问题已解决。

参考:
python爬虫处理在线预览的pdf文档 https://www.cnblogs.com/Eeyhan/archive/2019/12/30/12111371.html
ModuleNotFoundError: No module named '_sqlite3' https://blog.csdn.net/weixin_43229107/article/details/83689294