0

因此,我正在尝试获取任何网站餐厅菜单,然后抓取它,然后根据我已经拥有的算法,对其进行处理。这是我的问题:

这些菜单总是采用不同的格式!

示例:一个菜单可能对价格、名称和描述等内容有不同的类别,而另一个菜单可能用于名称和

价格和描述。其他一些菜单甚至在其页面顶部有额外的信息。

我的观点是每个菜单的组织方式和信息的显示方式在网站上有所不同。

如果我有菜单的网站,就很容易获取代码,但是我无法弄清楚如何以相同的方式对每个餐厅进行解析并从中组织信息。

所以这个问题不仅仅适用于这个例子......如果你有一个函数需要一个 url 并获取代码并需要以某种方式组织它,那么编写能够工作的代码的可能方法是什么在许多不同的格式?

注意:是的,代码可以不同,但​​不会有很大差异。总会有价格、名称和描述,它们很可能都被归类。所以我知道在这种情况下这是可能的,我只是不知道如何开始......有什么想法吗?

我在代码中尝试做的事情:

我想基本上这样创建一个字典:

{food_kind1:['name1/description1/price1','name2/description2,price2'],
 food_kind2:['name1/description1/price1','name2/description2,price2']}

food_kindX 将是菜单上不同种类食物(如肉类、鱼类等)的大标题。

做我想做的事情并不难,它只是能够始终阅读文档,无论格式如何。所以请帮忙!如果我不清楚,请告诉我

菜单示例

1:

<h2>Burgers</h2>
<div>
<header>
<h3>California</h3>
</header>
<p>sharp cheddar | hass avocado | watercress | tomatoes | raw red onions<br />
salsa verde <small><span style="font-size: 13px; line-height: 19px;">11.95$</span></small></p>
</div>

2:

<h4>ANTIPASTI</h4>
<ul>
    <span class="menuitem">Calamari Fritti</span>
    <span class="menuprice"> - $11.95</span>
    <span class="menudescription">Delicate tender calamari rings pan-fried until golden crisp. Topped with hot cherry peppers and served with our house made cocktail sauce and lemon garnish. </span>
    <br /><br />
    <span class="menuitem">Vongole Casino</span>
    <span class="menuprice"> - $10.95</span><br/>
    <span class="menudescription">Shucked littleneck clams topped with roasted red pepper, bacon and bread crumbs, then baked. </span>
</ul>

第一个有:

  • <h2>它是标签中的 food_kindX
  • 每个条目都在一个<div>标签中
  • 名称在<header>标签中
  • 标签中带有价格的描述 带有<p>标签中的 <small>价格

第二个有:

  • <h4>它是标签中的 food_kindX
  • 每个条目由两个</br>标签分隔
  • 名字在menuitem课堂上
  • 描述在menudescription课堂上
  • 价格在menuprice课堂上

如您所见,它们有些相似之处在于它们具有相同的信息并以相似的方式组织,但第一个主要使用不同的标签,而第二个主要使用类。菜单确实各不相同,我需要能够始终确定类别,以及每餐的名称、描述和价格。

4

1 回答 1

1

考虑使用正则表达式来解释这两种类型的菜单。

以下是如何抓取第一个菜单示例:

import re
from collections import defaultdict

menu_dict = defaultdict(list)

pattern = '<h2>(.*?)</h2>.*?<div>.*?<h3>(.*?)</h3>.*?<p>(.*?)<small><span .*?>(.*?)</span>'
text    = '''<h2>Burgers</h2>
                 <div>
                 <header>
                     <h3>California</h3>
                 </header>
             <p>sharp cheddar | hass avocado | watercress | tomatoes | raw red onions<br />
             salsa verde <small><span style="font-size: 13px; line-height: 19px;">11.95$</span></small></p></div>'''

results = re.findall(pattern, text, re.DOTALL)

for r in results:
    kind = r[0]
    name = r[1]
    description = r[2].replace('<br />\n', ' | ')
    price = r[3]

    value = name + '/' + description + '/' + price
    menu_dict[kind].append(value)

这是第二个菜单的类似示例:

import re

pattern = '<span class="menuitem">(.*?)</span>.*?<span class="menuprice">(.*?)</span>.*?<span class="menudescription">(.*?)</span>'

text    = '''<h4>ANTIPASTI</h4>
                 <ul>
                     <span class="menuitem">Calamari Fritti</span>
                     <span class="menuprice"> - $11.95</span>
                     <span class="menudescription">Delicate tender calamari rings pan-fried until golden crisp. Topped with hot cherry peppers and served with our house made cocktail sauce and lemon garnish. </span>
                     <br /><br />
                     <span class="menuitem">Vongole Casino</span>
                     <span class="menuprice"> - $10.95</span><br/>
                     <span class="menudescription">Shucked littleneck clams topped with roasted red pepper, bacon and bread crumbs, then baked. </span>
                 </ul>'''

results = re.findall(pattern, text, re.DOTALL)

for r in results:
    name = r[0]
    price = r[1][3:]
    description = r[2]

希望这能回答你的问题!

于 2013-06-10T06:18:48.977 回答