繁体   English   中英

使用 Python 下载 pdf 文件时出现问题

[英]Problem during Download of pdf file using Python

https://research.un.org/en/docs/ga/quick/regular/76我打算下载第一个决议 (A/RES/76/307),其中有链接 ( https://undocs. org/en/A/RES/76/307 ) 然后转换为https://documents-dds-ny.un.org/doc/UNDOC/GEN/N22/587/47/PDF/N2258747.pdf? OpenElement ,当被点击时。

我使用标准代码下载 pdf:

import requests

url = "https://undocs.org/en/A/RES/76/307"
response = requests.get(url)

print(response.status_code)
print(response.content)

with open("document.pdf", "wb") as f:
    f.write(response.content)

虽然 status_code 表示一切正常 (200),但内容只是:

b'\n<head>\n</head>\n<body text="#000000">\n<META HTTP-EQUIV="refresh" CONTENT="1; URL=/tmp/1286884.54627991.html">\n</body>\n</html>\n'

, 这显然不是文件的实际内容。 保存了一个 pdf 文件,但它太小了,我无法用文档查看器打开它(“不支持文件类型 HTML 文档(文本/html)”)。

如何使用 python 下载 pdf 文件?

如果您没有实际的下载链接,您将无法通过请求下载 pdf 文件。 您所指的网站正在浏览器本身内打开 pdf。

使用 Selenium/BeautifulSoup 可以解决这个问题。 使用 BeautifulSoup,我们从响应中提取临时 Url 到 pdf 文件。

soup = BeautifulSoup(response.text, 'html.parser')
print(soup)
meta = soup.find('meta')
url="https://daccess-ods.un.org"+meta['content'].split('URL=')[1]
#output https://daccess-ods.un.org/tmp/6937936.54441834.html

使用 Selenium,我们打开带有 pdf 插件的浏览器,最终下载 pdf 文件本身。 完整的代码可能如下所示:

import requests
from bs4 import BeautifulSoup
import time

url = "https://undocs.org/en/A/RES/76/307"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

meta = soup.find('meta')
url = "https://daccess-ods.un.org" + meta['content'].split('URL=')[1]


def download_pdf(lnk):
    from selenium import webdriver
    from time import sleep

    options = webdriver.ChromeOptions()

    download_folder = "C:\\test\\"

    profile = {"plugins.plugins_list": [{"enabled": False,
                                         "name": "Chrome PDF Viewer"}],
                                         "download.default_directory": download_folder,
                                         "download.extensions_to_open": "",
                                         "plugins.always_open_pdf_externally": True}

    options.add_experimental_option("prefs", profile)

    print("Downloading file from link: {}".format(lnk))
    driver = webdriver.Chrome(chrome_options=options)
    driver.get(lnk)
    filename = lnk.split("/")[4].split(".cfm")[0]
    print("File: {}".format(filename))
    time.sleep(5)
    print("Status: Download Complete.")
    print("Folder: {}".format(download_folder))
    driver.close()

print(url)
download_pdf(url)

(Shoutout: selenium 部分来自Python 下载 PDF Embedded in a Page )

不是很有经验,所以我的回答可能不是最好的记录。

您可以尝试使用 Beautiful Soup。 在这里很容易了解您想做什么。 它允许您在网页代码中搜索元素并以非常简单直接的方式下载元素。

您可以访问此处的一些链接并找到有用的信息。

https://www.geeksforgeeks.org/downloading-pdfs-with-python-using-requests-and-beautifulsoup/

https://beautiful-soup-4.readthedocs.io/en/latest/

我会更准确地帮助你,但很长一段时间没有使用它。

无论如何,很容易找到我正在谈论的信息,您将能够根据您的代码进行调整。

我假设使用 BS 没有问题。 如果有我就帮不了你了。 :)

享受编码乐趣!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM