1

我正在尝试编写一个爬虫来从使用 Java 中的正则表达式的站点获取菜单项。网站网址是 http://www.dineombaygarden.com/appetizers.html

如何使用 Pattern and Matcher 获取菜单项(蔬菜 Pakpora、洋葱或菠菜或土豆 Pakora ...)?

我的代码如下,但效果不佳。

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

试试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 回答
0

不是最好的正则表达式,但这可以完成工作

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

您可以使用Selenium的 Java API与网页进行交互。

例如:

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()

有关硒的更多信息:http: //seleniumhq.org/

有关 Abmash 的更多信息:https ://github.com/alp82/abmash

于 2012-04-24T14:25:09.873 回答