0

だから私はウェブサイトのレストランメニューを取り、それをつかみ、それから私がすでに持っているアルゴリズムに基づいて何かをしようとしています. これが私の問題です:

これらのメニューは常に異なる形式です。

例: あるメニューでは、価格、名前、説明などに異なるクラスがあり、別のメニューでは名前と説明に使用できます。

価格と説明の両方。他のメニューの中には、ページの上部に追加情報があるものもあります.

私のポイントは、各メニューの構成と情報の表示方法が Web サイトによって異なるということです。

メニューの Web サイトがあれば、コードを簡単に取得できますが、それを解析して、レストランごとに同じ方法で情報を整理することは、私には理解できませんでした。

したがって、この質問はこの例だけではありません...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>

2番目のものは次のとおりです。

  • <h4>タグの food_kindX です
  • </br>各エントリは 2 つのタグで区切られています
  • 名前はmenuitemクラスにあります
  • 説明はmenudescriptionクラスにあります
  • 価格はmenupriceクラスです

ご覧のとおり、これらは同じ情報を持ち、同様の方法で編成されているという点で多少似ていますが、前者は主に異なるタグを使用し、後者は主にクラスを使用しています。メニューは実に様々で、私は常にカテゴリを決定し、各食事の名前、説明、および価格を決定できるようにする必要があります。

4

1 に答える 1

1

正規表現を使用して 2 種類のメニューを解釈することを検討してください。

最初のメニュー例をスクレイピングする方法は次のとおりです。

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)

2 番目のメニューの同様の例を次に示します。

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 に答える