【问题标题】:Get a pdf file from a website to scrape using BeautifulSoup4使用 BeautifulSoup4 从网站获取 pdf 文件以进行抓取
【发布时间】:2020-07-20 09:39:20
【问题描述】:

网页的 html 源代码如下所示

<html>
<body>
   <embed name= "random for each page" type = "application/pdf" src = "somesrc" internalid = "random">
</body>
</html>

我需要从 pdf 文件中抓取具有不同数据的多个页面的数据(它们具有不同的名称和内部 ID)。我尝试 find_all 嵌入标签,但没有成功

【问题讨论】:

  • 你试过什么?
  • 还可以更具体地说明您需要哪些数据。听起来您是在寻求从特定 PDF 文件中获取数据的帮助,对吗?
  • @AaronS 是的,我正在尝试从 pdf 文件中获取数据,我手动下载了一个并使用 PyPDF2 完成,但我不知道如何使用 BeautifulSoup 下载或阅读它。

标签: python web-scraping beautifulsoup


【解决方案1】:

要下载文件,您可以使用请求包。 BeautifulSoup 是一个用于解析 HTML 而非下载文件的库。

现在您还没有提供任何信息来获取 URL 本身。我强烈建议您发布一些您尝试获取 URL 的代码,这样我们就不会只是在您不理解的情况下向您提供答案。

下面是您可以用来下载它们的代码。我还假设您已经能够从 PyPDF 获得所需的数据。您应该考虑的另一件事是 OS 模块,用于在使用 PyPDF 提取数据之前定位您下载的文件。这样您就可以自动处理正在处理的文件。

代码示例

import requests
r = requests.get(url, Stream=True)
with open("filename.pdf",'wb') as pypdf:
    for chunk in r.iter_content(chunk_size=1024)
      if chunk: 
         pypdf.write(ch)

解释

我们在 pdf 文件的 URL 上使用请求的 get 方法。 stream=True,这会延迟下载文件,直到我们要求它。它首先下载二进制标头,然后等待我们告诉它如何处理二进制数据体。

r.iter_content - 这会将文件分成 1024 字节的块。

然后我们循环这些块来写入文件。

【讨论】:

  • 网址看起来像这样“sitename/…”。我将 mid 作为输入并使用 15 exid 并为每个 exid 输出一个结果。我试图用 beautifulsoup 解析页面,但我不知道如何从 pdf 中获取数据。然后我意识到这是一个嵌入式 pdf,并认为我必须下载它并使用 PyPDF2 来获取数据。
【解决方案2】:

尝试过滤掉所有类型属性为“application/pdf”的标签,然后提取src属性来下载pdf

喜欢这个

pdfTags = soup.findAll(attrs={"type" : "application/pdf"})
for p in pdfTags:
    print(p['src'])

【讨论】:

    猜你喜欢
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多