2016-01-15 67 views
1

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

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

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

任何有识之士将不胜感激。

+0

如果没有什么特殊的原因,这个* *使用Python脚本完成,我建议使用[wkhtmltopdf](http://wkhtmltopdf.org/)。 – amphetamachine

+0

该页面的内容是用Javascript动态加载的。您不能简单地通过下载HTML文本来获取所有内容。 – jumbopap

+0

@ jumbopap谢谢,我怀疑类似的东西可能是返回值错过菜单内容的原因。任何建议如何处理这个? – Camuslu

回答

3

虽然soup.get_text()从HTML文件(网页)返回的所有文字,这里的问题是,菜单嵌入在页面的PDF,这美丽的汤无法访问。实际的PDF文件,在Javascript等被定义如下:

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

提取这种这时最简单的方法可能是使用正则表达式。虽然这通常是一个坏主意,在这里你正在寻找一个非常具体的事情 - 一个文件,包裹在“报价”结尾.pdf。下面的代码会发现并提取网址:

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文本有点麻烦。

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

返回:作为使用功能in this answer to another question描述

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

然后将解压后的文本:您可以下载该文件第一

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 

... 
+0

这工作很好,谢谢先生! – Camuslu