记一次为解决Python读取PDF文件的Shell操作

目录

  • 一、背景
  • 二、问题
  • 三、解决
  • 四、一顿分析及 Shell 操作
  • 五、后续

一、背景

本想将 PDF 文件转换为 Word 文档,然后网上搜索了一下发现有挺多转换的软件。有的是免费的、收费,咱也不知哪个好使,还得一个个安装试用。先不说能不解决问题,就这安装试用想想就脑壳疼。便想起了"Python 大法",随即搜了几篇看起来比较完整的博客,二话不说粘贴复制,改改运行试试。使用环境(python3.6+pdfminer3k),代码这里就不放出来了。

二、问题

运气不好,这一试就报错WARNING:root:GBK-EUC-H,然后又搜了一下有同样的报错问题,但是这篇博客没啥大用,仅仅是知道缺了相关的字体文件,通过其中的链接顺藤摸瓜找到了 github 上的字体文件列表页
https://github.com/euske/pdfminer/tree/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap

三、解决

下载了报错的对应文件 GBK-EUC-H.pickle.gz,然后将其文件解压把放置 Python 的安装目录下 Lib\site-packages\pdfminer\cmap 路径中,再次运行又报错 "pdfminer.converter:undefined: <PDFCIDFont: basefont=‘?¢èí??oú‘, cidcoding=‘Adobe-GB1‘>, 3027". 想想等下有报错还得下,索性全部下下来。

四、一顿分析及 Shell 操作

1.先网页 F12 打开控制台分析 Element 元素,Xpath 信息 "//td[@class=‘content‘]/span/a/@href"

2.使用 curl 命令获取响应并处理 (通过"检查网页源码"发现 span 标签和 a 标签同行)

  • 先确认是否与步骤 1 中的数量一致
# 通过获取父标签信息的之后的行
curl -s https://github.com/euske/pdfminer/tree/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap | grep -A1 '<td class="content">' |grep "<span" | wc -l
# 直接正则匹配到行
curl -s https://github.com/euske/pdfminer/tree/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap | grep -E '\s+<span.*><a.*title' |wc -l
  • 确认一致,则进行下一步数据清理,进而获得所有字体文件列表
curl -s https://github.com/euske/pdfminer/tree/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap | grep -E '\s+<span.*><a.*title' |awk -F '"' '{print $6}'

3.进入某个文件详情页,分析下载请求地址
将下面链接放入地址栏,会进入文件下载操作,所以这就是文件的真实下载地址

4.对其他两三个文件进行同样分析,发现其规律,部分固定链接地址
https://raw.githubusercontent.com/euske/pdfminer/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap

5.开始命令行构造下载地址

curl -s https://github.com/euske/pdfminer/tree/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap |grep -E '\s+<span.*><a.*title'|awk -F '"' '{print $6}'|while read line; do echo "https://raw.githubusercontent.com/euske/pdfminer/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap/$line"; done

6.升级-->构造及文件下载脚本

# !/usr/bin/bash

# 参数校验
folder=$1
# 参数为空判断
[ -z $folder ] && folder="downfiles"

# 为文件且存在判断,不能重名
if [ -f $folder ]
then
    echo "Error: 【$folder】 already exist! and it's file"
    exit
fi

# 不存在则创建
if [ ! -e $folder ]
then
    mkdir $folder
fi

echo ""
echo "文件保存路径为: $PWD/$folder"
echo ""

# github 主页列表显示地址
listPage="https://github.com/euske/pdfminer/tree/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap"

# github 详情显示地址
# https://github.com/euske/pdfminer/blob/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap/
# github 下载按钮地址
# https://github.com/euske/pdfminer/raw/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap/

# 真实下载地址
base="https://raw.githubusercontent.com/euske/pdfminer/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap/"
# 模拟浏览器
userAgent="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"

files=`curl -s -A "${userAgent}" $listPage | grep -E '\s+<span.*><a.*title' | awk -F '"' '{print $6}'`

if [ -z "$files" ]
then
    echo "获取列表信息失败!!!"
    exit
else
    num=`echo $files| awk 'BEGIN{RS=" "}END{print NR}'`
    echo "成功获取列表信息, 总共 $num"
fi

echo ""

for name in $files
do
    # infos="curl -s -A \"${userAgent}\" -w %{http_code} \"$base$name\" -o $folder/$name"
    sleep 1
    res=`curl -s -A "${userAgent}" -w %{http_code} "$base$name" -o $folder/$name`
    if [ "$res" = "200" ]
    then
        echo "SUCCESS: 【$name】 下载成功"
    else
        # echo $infos
        echo "ERROR: 【$name】 下载失败--$res"
        sleep 0.5
    fi
done

五、后续

文件下载出现

原文地址:https://www.cnblogs.com/zeo-to-one/p/12032061.html

时间: 2024-10-07 04:27:53

记一次为解决Python读取PDF文件的Shell操作的相关文章

解决Python读取文件时出现UnicodeDecodeError: &#39;gbk&#39; codec can&#39;t decode byte...

用Python在读取某个html文件时会遇到下面问题: 出问题的代码: 1 if __name__ == '__main__': 2 fileHandler = open('../report.html', mode='r') 3 4 report_lines = fileHandler.readlines() 5 for line in report_lines: 6 print(line.rstrip()) 修改方式是在open方法指定参数encoding='UTF-8': if __nam

Python读取PDF内容

晚上翻看<Python网络数据采集>这本书,看到读取PDF内容的代码,想起来前几天集搜客刚刚发布了一个抓取网页pdf内容的抓取规则,这个规则适用的是已经把pdf内容合到html里的情况. 现在这个python版本的代码,是读取pdf文件内容(互联网上的或是本地的),觉得这个很有参考价值,就发个贴记录下来.这段代码主要是用了一个第三方库PDFMiner3K把PDF读成字符串,然后用StringIO转换成文件对象. from urllib.request import urlopen from p

深入学习python解析并读取PDF文件内容的方法

这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应用.主要参考了一些已有的博客内容,代码. 主要思路是首先利用一个做项目的形式,描述所做的问题,运行环境,和需要安装的库,然后写代码,此代码是在python2.7中运行,然后写出在python3.6中运行的代码,并详细解释python2.7和python3.6中python库的一些不同之处,最后详细的

python读取excel文件(xrld模块)

Python读取excel文件 一.python  xlrd模块 安装 mac 下安装python  xlrd模块 http://www.crifan.com/python_read_excel_xls_file_xlrd/comment-page-1/ python setup.py install 在mac 下出现的错误是 http://stackoverflow.com/questions/18199853/error-could-not-create-library-python-2-7

Python读取CSV文件,报错:UnicodeDecodeError: &#39;gbk&#39; codec can&#39;t decode byte 0xa7 in position 727: illegal multibyte sequence

Python读取CSV文件,报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xa7 in position 727: illegal multibyte sequence 解决办法: 在语句open(sFileName,newline='')中,增加encoding='UTF-8',如下: open(sFileName,newline='',encoding='UTF-8') Python读取CSV文件,报错:UnicodeDecode

Python读取txt文件

Python读取txt文件,有两种方式: (1)逐行读取 1 data=open("data.txt") 2 line=data.readline() 3 while line: 4 print line 5 line=data.readline() (2)一次全部读入内存 1 data=open("data.txt") 2 for line in data.readlines(): 3 print line

Python读取Yaml文件

近期看到好多使用Yaml文件做为配置文件或者数据文件的工程,随即也研究了下,发现Yaml有几个优点:可读性好.和脚本语言的交互性好(确实非常好).使用实现语言的数据类型.有一个一致的数据模型.易于实现. 既然有这么多好处,为什么不用呢,随后开始研究在Python中怎么读取Yaml文件,下面我们来看下: 1.首先需要下载Python的yaml库PyYAML,下载地址:http://pyyaml.org/,安装过程就省略...... 2.建立一个.py文件 3.import yaml 4.f = o

python 读取 excel文件

python读取excel文件的链接都是从这里获取的: http://blog.csdn.net/longshen747/article/details/17194259 http://www.cnblogs.com/yanzhi123/archive/2012/04/16/2452214.html 上个示例的代码: import xml.etree.ElementTree as ETimport xlwtimport os path = "D:/Cai_Bishe/xml/"prin

python 读取excel文件

1.用python读取csv文件: csv是逗号分隔符格式 一般我们用的execl生成的格式是xls和xlsx  直接重命名为csv的话会报错: Error: line contains NULL byte insun解决方案:出错原因是直接是把后缀为xls的execl文件重命名为csv的 正常的要是另存为csv文件 就不会报错了 譬如我们有这么个csv文件: #!/usr/bin/env python # -*- coding:utf-8 -*-   import csv with open(