【问题标题】:Python scraping pdf from URLPython从URL抓取pdf
【发布时间】:2016-01-15 20:50:24
【问题描述】:

我想从 URL“http://www.nycgo.com/venues/thalia-restaurant#menu”中抓取文本 我感兴趣的文本位于页面上的“菜单”选项卡中。我试过 BeautifulSoup 来获取页面上的所有文本,但是下面代码的返回值错过了菜单中的所有文本。

html = urllib2.urlopen("http://www.nycgo.com/venues/thalia-restaurant#menu")
html=html.read()
soup = BS(html)
print soup.get_text()

当我从菜单内容中检查元素时,菜单的内容似乎是页面上 html 的一部分。我确实注意到,在物理浏览页面时,菜单需要几秒钟才能完全加载。不确定这是否是上面的代码无法获取菜单内容的原因。

任何见解将不胜感激。

【问题讨论】:

  • 如果没有任何特殊原因必须使用 Python 脚本完成,我建议使用wkhtmltopdf
  • 页面的内容是使用 Javascript 动态加载的。您无法仅通过下载 HTML 文本来获取所有内容。
  • @jumbopap 谢谢,我怀疑类似的事情可能是返回值错过菜单内容的原因。有什么建议可以解决这个问题吗?
  • @amphetamachine 谢谢,我尝试了该工具,但创建的 pdf 仍然缺少菜单内容:(

标签: python html beautifulsoup


【解决方案1】:

虽然soup.get_text() 从 HTML 文档(网页)返回所有文本,但这里的问题是菜单作为 PDF 嵌入页面中,Beautiful soup 无法访问。实际的 PDF 文件在 Javascript 中定义如下:

{
    name: "menu",
    show: Boolean(1),
    url: "/assets/files/programs/rw/2016W/thalia-restaurant.pdf"
}

最简单的提取方法可能是使用正则表达式。虽然这通常是一个坏主意,但在这里您正在寻找一个非常具体的东西 - 一个文件,包含在以 .pdf 结尾的“引号”中。以下代码将找到并提取 URL:

import re
from urllib import urlopen

html = urlopen("http://www.nycgo.com/venues/thalia-restaurant#menu")
html_doc = html.read()

match = re.search(b'\"(.*?\.pdf)\"', html_doc)
pdf_url = "http://www.nycgo.com" + match.group(1).decode('utf8')

现在pdf_url 是:

u'http://www.nycgo.com/assets/files/programs/rw/2016W/thalia-restaurant.pdf'

但是,从 PDF 中提取文本有点棘手。你可以先下载文件:

from urllib import urlretrieve
urlretrieve(pdf_url, "download.pdf")

然后使用函数in this answer to another question

text = convert_pdf_to_txt("download.pdf")
print(text)

返回:

NEW YOUR CITY 
RESTAURANT WEEK

WINTER 2016

MONDAY - FRIDAY
828 Eighth Avenue
New York City, 10019

Tel: 212.399.4444

www.restaurantthalia.com

LUNCH $25
FIRST COURSE
CREAMY POLENTA
fricassee of truffle mushrooms

...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多