如何使用Python下载多个PDF文件?
我正在尝试下载的每一页的出版物 我的最终目标是解析PDF文件中的文本并定位某些关键字 到目前为止,我已经能够刮掉所有页面上PDF文件的链接。我已将这些链接保存到列表中。现在,我想浏览一下列表并用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
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.