如何使用Python下载多个PDF文件?

如何使用Python下载多个PDF文件?,python,web-scraping,beautifulsoup,Python,Web Scraping,Beautifulsoup,我正在尝试下载的每一页的出版物 我的最终目标是解析PDF文件中的文本并定位某些关键字 到目前为止,我已经能够刮掉所有页面上PDF文件的链接。我已将这些链接保存到列表中。现在,我想浏览一下列表并用Python下载所有pdf文件。一旦下载了这些文件,我就想对它们进行解析 这是我迄今为止使用的代码: import requests from bs4 import BeautifulSoup import lxml import csv # This code adds all PDF links i

我正在尝试下载的每一页的出版物

我的最终目标是解析PDF文件中的文本并定位某些关键字

到目前为止,我已经能够刮掉所有页面上PDF文件的链接。我已将这些链接保存到列表中。现在,我想浏览一下列表并用Python下载所有pdf文件。一旦下载了这些文件,我就想对它们进行解析

这是我迄今为止使用的代码:

import requests
from bs4 import BeautifulSoup
import lxml
import csv

# This code adds all PDF links into a list called 
#"publications".

publications=[]
for i in range(19):
    response=requests.get('https://occ.ca/our- 
   publications/page/{}/'.format(i), headers={'User- 
    Agent': 'Mozilla'})

    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'lxml')
        pdfs = soup.findAll('div', {"class": 
       "publicationoverlay"})
        links = [pdf.find('a').attrs['href'] for pdf in pdfs]
    publications.append(links)
接下来,我想浏览一下这个列表并下载PDF文件。 这是我运行代码时遇到的错误

这就是我得到的错误 回溯(最近一次呼叫最后一次): 文件“C:\Users\plumm\AppData\Local\Programs\Python\Python37\m.py”,第23行,在 urllib.request.urlretrieve(x,'Publication{}.pdf'。格式(范围(213))) 文件“C:\Users\plumm\AppData\Local\Programs\Python\Python37\lib\urllib\request.py”,urlretrieve中的第247行 使用contextlib.closing(urlopen(url,data))作为fp: 文件“C:\Users\plumm\AppData\Local\Programs\Python\Python37\lib\urllib\request.py”,第222行,在urlopen中 返回opener.open(url、数据、超时) 文件“C:\Users\plumm\AppData\Local\Programs\Python\Python37\lib\urllib\request.py”,第531行,处于打开状态 响应=方法(请求,响应) 文件“C:\Users\plumm\AppData\Local\Programs\Python\37\lib\urllib\request.py”,第641行,在http\U响应中 “http”、请求、响应、代码、消息、hdrs) 文件“C:\Users\plumm\AppData\Local\Programs\Python\Python37\lib\urllib\request.py”第569行出错 返回自我。调用链(*args) 文件“C:\Users\plumm\AppData\Local\Programs\Python\Python37\lib\urllib\request.py”,第503行,在调用链中 结果=func(*args) 文件“C:\Users\plumm\AppData\Local\Programs\Python\Python37\lib\urllib\request.py”,第649行,默认为http\u error\u raise HTTPError(请求完整的url、代码、消息、hdrs、fp)
urllib.error.HTTPError:HTTP error 403:禁止

能否请您告知错误发生的行号?

请尝试:

import requests
from bs4 import BeautifulSoup
import lxml
import csv

# This code adds all PDF links into a list called 
#"publications".

publications=[]
for i in range(19):
    response=requests.get('https://occ.ca/our- 
   publications/page/{}/'.format(i), headers={'User- 
    Agent': 'Mozilla'})

    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'lxml')
        pdfs = soup.findAll('div', {"class": 
       "publicationoverlay"})
        links = [pdf.find('a').attrs['href'] for pdf in pdfs]
    publications.extend(links)

for cntr, link in enumerate(publications):
    print("try to get link", link)
    rslt = requests.get(link)
    print("Got", rslt)
    fname = "temporarypdf_%d.pdf" % cntr
    with open("temporarypdf_%d.pdf" % cntr, "wb") as fout:
        fout.write(rslt.raw.read())
    print("saved pdf data into ", fname)
    # Call here the code that reads and parses the pdf.

你想要一个层次列表还是一个简单的链接列表?如果您想要列表的扁平链接,那么您不应该使用append,extend so
publications.extend(links)
而应该使用`publications.append(links)`来代替第二个代码段。我以为申请是PDF的列表?然后,您是否应该只对出版物中的链接执行
:rslt=request.get(link)
,然后在for循环中使用一个工具,该工具可以解析pdf并提取单词?出版物是pdf链接的列表。在上面的代码片段中,您使用的是请求,我认为这很容易使用。在第二部分中,您使用了urllib.request,在我看来,它使用起来更烦人。我建议继续使用更简单的代码。在我看来,它似乎是一个pdf链接列表,所以它似乎不是一个简单的列表,至少如果你真的使用了你发布的代码。声明名为publications的空列表,然后在此for循环中执行for循环,创建名为links的列表,然后将此列表附加到发布。(因此列表列表)如果使用extend,您将拥有一个平面列表。我对堆栈溢出比较陌生,但这不是更好的注释而不是答案吗?我无法给出注释,这就是我写答案的原因。你必须有50分的声誉。啊,真的没有看到你的代表。我忘记了这个问题,只是一两周前有同样的问题。但是我在回答中提到,这不是一个答案,但我不能评论以减少混淆。我认为如果我删除这个答案会更好,你解决了问题=)无论如何,我在评论部分添加了你的评论。因此,更有经验的人可以决定你是否应该删除此评论,或者是否应该保留此评论,这样我们就可以在你的anser上对评论进行投票,这样,你就可以更接近一个更好的代表。感谢你的帮助gelonida。代码可以工作,但我不确定它是做什么的,因为它似乎没有下载PDF文件。这个答案仍然没有通过PDF代码,但它至少应该尝试下载每个PDF文件。要浏览pdf文件的文本,您可以使用库(如我增强了代码)将pdf保存到临时文件中以进行调试/测试。
import requests
from bs4 import BeautifulSoup
import lxml
import csv

# This code adds all PDF links into a list called 
#"publications".

publications=[]
for i in range(19):
    response=requests.get('https://occ.ca/our- 
   publications/page/{}/'.format(i), headers={'User- 
    Agent': 'Mozilla'})

    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'lxml')
        pdfs = soup.findAll('div', {"class": 
       "publicationoverlay"})
        links = [pdf.find('a').attrs['href'] for pdf in pdfs]
    publications.extend(links)

for cntr, link in enumerate(publications):
    print("try to get link", link)
    rslt = requests.get(link)
    print("Got", rslt)
    fname = "temporarypdf_%d.pdf" % cntr
    with open("temporarypdf_%d.pdf" % cntr, "wb") as fout:
        fout.write(rslt.raw.read())
    print("saved pdf data into ", fname)
    # Call here the code that reads and parses the pdf.