2012-04-24 25 views
1

我正在嘗試編寫一個抓取工具,以獲取在java中使用正則表達式的站點的菜單項。該網站的網址是 http://www.dinebombaygarden.com/appetizers.html在Java中使用正則表達式的網絡抓取

我怎樣才能得到菜單項目(蔬菜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工作不正常。任何人都可以解決這個問題?

非常感謝。

+6

是的,不要使用正則表達式來解析HTML(或XML)。使用HTML解析器來做到這一點。 – 2012-04-24 14:11:57

+1

看看[這個答案](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)。 – dasblinkenlight 2012-04-24 14:13:38

+1

我認爲這是定義明確,簡單到足以通過正則表達式處理。下跪反應不一定總是最好的。 – mellamokb 2012-04-24 14:18:39

回答

1

你有幾個問題,你的正則表達式:

  1. [A-Z][a-z]+應用+只對[a-z],不會妥善處理空間(即,它只會匹配Vegetable PakoraPakora)。
  2. 您需要在.{10,50}中轉義.,否則它會匹配任何字符而不是特定的時間段:\.{10,50}

這裏有一個正則表達式會正確匹配,並捕獲食物的名稱,以及價格在捕捉組:

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

它通過尋找<h3>標籤,然後捕捉在第一個時期之前的所有文本作爲食物的名稱。其餘部分與您的原始正則表達式相同,除了我已經在價格附近添加了捕獲。

演示:http://www.rubular.com/r/I7Hyk4cAI0

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

0

嘗試http://jsoup.org

Document doc = Jsoup.connect("http://www.dinebombaygarden.com/appetizers.html").get(); 
Elements newsHeadlines = doc.select("div.left-data h3"); 
0

不是最好的正則表達式,但是這將做的工作

String menuRegex = "['A-Za-z\\s]+\\.{10,50}[$][\\s]*[0-9]*\\.?[0-9]+";