【问题标题】:How do I decode text from a pdf online with Requests?如何使用 Requests 在线解码 pdf 中的文本?
【发布时间】:2017-11-08 03:34:09
【问题描述】:

我正在尝试从澳大利亚证券交易所网站创建一个 pdf 提取器,这将允许我搜索公司发布的所有“公告”并在这些公告的 pdf 中搜索关键词。

到目前为止,我所做的是使用 requests 库。以下是我目前的代码:

import requests

url = 'http://www.asx.com.au/asxpdf/20171103/pdf/43nyyw9r820c6r.pdf'
response = requests.get(url)

print(response.content)

但是打印的是以下字符串(我将其切断,因为它太长了):

> b'%PDF-1.5\r%\xe2\xe3\xcf\xd3\r\n5 0 obj\r<</E 212221/H [ 1081 145 ]/L
> 212973/Linearized 1/N 1/O 8/T 212553>>\rendobj\r                      
> \r\r42 0 obj\r<</DecodeParms <</Columns 5/Predictor 12>>/Encrypt 7 0
> R/Filter /FlateDecode/ID [(\\216\\203\\217T\\n\\f\\236\\345?%\\214t4
> E\\271) (\\216\\203\\217T\\n\\f\\236\\345?%\\214t4 E\\271)]/Index [5
> 38]/Info 3 0 R/Length 86/Prev 212554/Root 6 0 R/Size 43/Type /XRef/W
> [1 3
> 1]>>\rstream\nx\x9ccbd`\x10``b``:\x04"\x19\xab\xc1d-X\xc4\x06D2\xac\x02\xb3\x93\xc0\xe2\x1d
> \x92?\x07,\x1e\t"\xb9T\x80$\xe3\x84\xcb@\x92\xa9m"\x03\x13\xe3\xdf\x13Z`Y\x06\xc6\x01#\xff3\xb0h\xbcfb`\xb6\x12\x02\xba\xe4\xef!S\x06\x0

我已经搜索了几天 stackexchange 和其他网站,并尝试使用 print(response.content.decode('utf-8') 以及 ascii,但它们都不是我能阅读的任何东西。

抱歉,我知道很明显我是个菜鸟,但我们将不胜感激任何帮助!

非常感谢。

【问题讨论】:

    标签: python python-3.x python-requests


    【解决方案1】:

    PDF 文件是二进制模式,您应该将其作为带有页眉和页脚的格式来阅读。您不能将二进制文件作为原始字符串读取。

    1) 如果您的文件名中有任何空格,那么 PyPDF 2 解密函数最终将失败,尽管返回成功代码。在通过 PyPDF2 运行 PDF 之前,尝试在命名 PDF 时使用下划线。

    例如, 而不是“我的pdf.pdf”做一些类似“my_pdf.pdf”的事情。

    2) 尝试使用空字符串作为密码解密它,它可以工作。

    试试这个:

    import requests, PyPDF2
    
    
    url = 'http://www.asx.com.au/asxpdf/20171103/pdf/43nyyw9r820c6r.pdf'
    response = requests.get(url)
    my_raw_data = response.content
    
    with open("my_pdf.pdf", 'wb') as my_data:
        my_data.write(my_raw_data)
    
    open_pdf_file = open("my_pdf.pdf", 'rb')
    read_pdf = PyPDF2.PdfFileReader(open_pdf_file)
    if read_pdf.isEncrypted:
        read_pdf.decrypt("")
        print(read_pdf.getPage(0).extractText())
    
    else:
        print(read_pdf.getPage(0).extractText())
    

    【讨论】:

    • 这太棒了!非常感谢。我如何将 my_raw_data 变量转换为字符串然后进行操作,而不必将其写入 PDF 然后读取它?或者这是不可能的?非常感谢。
    • @JamesWard:你想从你的 pdf 中提取内容作为字符串吗?并将其保存在 txt 文件中?
    • @JamesWard:只需将 print(ready pdf.getPage(0).extract Text()) 更改为 blabla = read pdf.getPage(0).extract Text(),现在您有了一个字符串变量,你可以用它做任何事情!你可以给我打勾吗 :)
    • 但是我的电脑上还有一个 pdf 文件。我想知道是否可以从 my_raw_data 转到字符串,而不必将其写入 pdf 文件、读取 pdf 文件然后删除 pdf 文件(因为我想这样做数千次)。谢谢!打勾你:)
    • @JamesWard:我建议你问一个关于“我如何从内联 raw_bytes(而不是文件)读取 pdf 文件”的新问题。
    【解决方案2】:

    该响应是表示 PDF 内容的编码字符串。您需要使用pdfminer 等提取工具。页面上有一个示例向您展示如何通过 Python 进行样本提取。

    【讨论】:

    • 我尝试过使用 PyPDF2,但是它说 pdf 是加密的,我不确定密码是什么。这是我的代码:import PyPDF2 pdfobj = open('test.pdf', 'rb') pdfreader = PyPDF2.PdfFileReader(pdfobj) #pageobj = pdfreader.getPage(0) print(pdfreader.isEncrypted) 这返回 true,但我不确定密码是什么。
    • 你能在另一个应用程序上打开“test.pdf”吗?如果不是,那么它可能是密码加密的。在这种情况下,在不知道密码或使用的加密算法的情况下,打开它是不简单的。
    • 我可以在我的电脑上打开它而无需密码。我很困惑。感谢您的快速回复。
    猜你喜欢
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多