2016-01-15 105 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