1

javaで正規表現を使用してサイトからメニュー項目を取得するクローラーを作成しようとしています。ウェブサイトの URL は http://www.dinebombaygarden.com/appetizers.htmlです。

Pattern と Matcher を使用して、メニュー項目 (野菜パクポラ、オニオンまたはほうれん草、ポテト​​ パコラなど) を取得するにはどうすればよいですか?

私のコードは次のとおりですが、うまくいきません。

public ArrayList<String> getMenuItems(String menuURL, String menuRegex) throws IOException{
    ArrayList<String> items = new ArrayList<String>();
    Document doc = Jsoup.connect(menuURL).post();
    String text = doc.body().text();
    System.out.println(text);
    Pattern pattern = Pattern.compile(menuRegex);
    Matcher matcher = pattern.matcher(text);
    while(matcher.find()){
        items.add(matcher.group());
    }
    return items;
}

String menuURL = "http://www.dinebombaygarden.com/appetizers.html";
String menuRegex = "[A-Z][a-z]+.{10,50}[$]\\s[\\d.]+.95";

ここの menuRegex はうまく機能していません。誰でもこの問題を解決できますか?

どうもありがとうございました。

4

4 に答える 4

1

正規表現にはいくつかの問題があります。

  1. [A-Z][a-z]++のみに を適用し、[a-z]スペースを適切に処理しません (つまり、 のみに一致PakoraVegetable Pakoraます)。
  2. .でエスケープする必要があります.{10,50}。そうしないと、具体的にピリオドではなく任意の文字に一致します: \.{10,50}.

正しく一致し、キャプチャ グループで食品の名前と価格をキャプチャする正規表現を次に示します。

\<h3\>([^.]+)\.{10,50}[$]\s([\d.]+.95)

タグを見つけて<h3>、最初のピリオドより前のすべてのテキストを食品の名前としてキャプチャすることで機能します。残りは元の正規表現と同じですが、価格の周りのキャプチャを追加しました.

デモ: http://www.rubular.com/r/I7Hyk4cAI0

于 2012-04-24T14:15:38.200 に答える
0

最高の正規表現ではありませんが、これでうまくいきます

String menuRegex = "['A-Za-z\\s]+\\.{10,50}[$][\\s]*[0-9]*\\.?[0-9]+";
于 2012-04-24T14:47:54.933 に答える
0

Seleniumの Java API を使用して Web ページを操作できます。

例えば:

WebDriver driver = new FirefoxDriver();
driver.get("http://www.dinebombaygarden.com/appetizers.html");
List<WebElement> menuElements = driver.findElements(By.cssSelector("#content-center .left-data > h3"));
// now iterate through the elements and get the contents with .getText()

また、私はAbmashの開発者でもあります。ソースコードについて何も知らなくても、より視覚的な方法で同じ作業を行うことができます。例:

Browser browser = new Browser("http://www.dinebombaygarden.com/appetizers.html");
HtmlElements menuElements = browser.query(headline(), below(headline("appetizers"))).find();
// now iterate through the elements and get the contents with .getText()

Selenium の詳細: http://seleniumhq.org/

Abmash の詳細: https://github.com/alp82/abmash

于 2012-04-24T14:25:09.873 に答える
0

http://jsoup.orgを試してください

Document doc = Jsoup.connect("http://www.dinebombaygarden.com/appetizers.html").get();
Elements newsHeadlines = doc.select("div.left-data h3");
于 2012-04-24T14:41:05.007 に答える