使用美汤解析python

Parsing through python using beautiful soup

我正在尝试解析结构不佳的餐厅网站并仅打印菜单 headers,例如:

"Bento Box", "Bara Chirashi set", 等等

我正在使用 Python 库 Beautiful Soup,但我无法获得正确的输出:

import requests
from bs4 import BeautifulSoup

url = ('http://www.sushitaro.com/menu-lunch.html')
r = requests.get(url, auth=('user', 'pass'))

data = r.text

soup = BeautifulSoup(data)
dataList = list()

for string in soup.findAll('b'):
    dataList.append(string)

print(dataList)

这个 returns 元素太多了,它们作为 HTML 而不仅仅是文本返回,文本内容本身真的很乱,有 unicode 字符和多余的空格。

我真的遇到了麻烦,如有任何帮助,我们将不胜感激。

我认为由于您打印的方式,输出可能难以辨认。

尝试:

for d in dataList:
    print(d)

听起来您只想从相关网站获取菜单项的名称。页面抓取可能很棘手,除了学习库之外,您还必须查看页面的结构。例如,这里的价格也是粗体,所以如果您只想要菜单项的名称,则必须找到不同的区别特征。在这种情况下,站点设计者将每个菜单标题的字体大小增加了一个,因此,按照您的代码通过 "soup" 的定义,您可以抓取所有且仅抓取菜单标题:

import requests 
from bs4 import BeautifulSoup
url = ('http://www.sushitaro.com/menu-lunch.html')
r = requests.get(url, auth=('user', 'pass'))
data = r.text
soup = BeautifulSoup(data)

menuTitlesHTML = soup.findAll('font', {"size": "+1"})

现在,这将 return 很多 HTML 而不仅仅是文本。我假设您熟悉 Python 列表理解,这在这里非常方便。如果你想要文本,你可以试试:

menuTitlesDirty = [titleHTML.text for titleHTML in menuTitlesHTML]

但现在您会注意到标题有很多多余的白色space,包括在 unicode 中,以及一些额外的字符,例如“@s”。由于您似乎只需要 ASCII 菜单标题,我们可以简单地转换为 ASCII,忽略错误,以清理 unicode。为此,我们可以将单个 space 替换为捕获不需要字符的正则表达式上的匹配项:换行符、spaces 和 @s。为此,我们可以应用“.strip()”,删除字符串末尾多余的 space。总之这是:

import re
badChars = re.compile('[\s@]+')
menuTitles = [badChars.sub(" ", dirtyTitle.encode('ascii', 'ignore')).strip() for dirtyTitle in menuTitlesDirty]

这return是你建议的你想要的:

['Lunch Bento Box',
 'Bara Chirashi set',
 'Tekka Chirashi set',
 'Sushi Mori set',
 'Sushi Jo set',
 'Sushi Tokujo set',
 'Sashimi & Tempura Teishoku',
 'Tokujo Sashimi',
 "Today's Lunch Special",
 'Saba Shioyaki Teishoku',
 'Katsu Don set',
 'Tem Don set',
 'Cold Soba or Udon w/one topping',
 'Hot Soup Udon or Soba w/one Topping']

总而言之:页面抓取是一个混乱的迭代过程,您希望利用页面上的任何差异来发挥自己的优势。 Python REPL 真的是你的朋友,在这里。希望这能让您和其他人对许多工具有所了解,在 Python 中更普遍,特别是 Beautiful Soup,它们可以帮助完成此过程。