Cam*_*slu 1 html python beautifulsoup
我想从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()
Run Code Online (Sandbox Code Playgroud)
当我检查菜单内容中的元素时,菜单的内容似乎是页面上html的一部分。我确实注意到,当实际浏览页面时,菜单完全加载需要几秒钟。不知道这是否就是上面的代码无法获取菜单内容的原因。
任何见识将不胜感激。
虽然soup.get_text() 将从 HTML文档(网页)返回所有文本,但是这里的问题是菜单以PDF格式嵌入页面中,Beautiful汤无法访问。实际的PDF文件是用Javascript定义的,如下所示:
{
name: "menu",
show: Boolean(1),
url: "/assets/files/programs/rw/2016W/thalia-restaurant.pdf"
}
Run Code Online (Sandbox Code Playgroud)
提取此内容的最简单方法可能是使用正则表达式。虽然这通常是个坏主意,但您在这里要查找的是非常具体的内容-文件,文件中以“ .quots”结尾的“引号”包装。以下代码将找到并提取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')
Run Code Online (Sandbox Code Playgroud)
现在pdf_url是:
u'http://www.nycgo.com/assets/files/programs/rw/2016W/thalia-restaurant.pdf'
Run Code Online (Sandbox Code Playgroud)
但是,从PDF中提取文本比较麻烦。您可以先下载文件:
from urllib import urlretrieve
urlretrieve(pdf_url, "download.pdf")
Run Code Online (Sandbox Code Playgroud)
text = convert_pdf_to_txt("download.pdf")
print(text)
Run Code Online (Sandbox Code Playgroud)
返回值:
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
...
Run Code Online (Sandbox Code Playgroud)