记一次为解决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"    exitfi# 不存在则创建if [ ! -e $folder ]then    mkdir $folderfiecho ""   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 "获取列表信息失败!!!"    exitelse    num=`echo $files| awk 'BEGIN{RS=" "}END{print NR}'`    echo "成功获取列表信息, 总共 $num"fiecho ""for name in $filesdo    # 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    fidone

五、后续

文件下载出现

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

评论关闭