2015-06-22 42 views
3

首先讓我告訴你我來自哪裏。我有一個字符串,這是一個網站的HTML代碼,我用JSOUP得到了這個。反正這樣的HTML都在字符串中,我可以打印到一個文本文件。所以我想從這個代碼裏獲得歌曲和每首歌曲是由同一個「標籤」如何使用模式獲取2個已知字符串之間的值

這是從文本文件我打印它

  <div class="title" itemprop="name"> 
      Wrath 
      </div> </td> 

在記事本中,它看起來像一條線一行,但是當你複製和粘貼它看起來像這樣。所以,我想是在中間的憤怒,所以我試圖使一個模式使用此其他疊後其幫助找到:Java regex to extract text between tags

這是我的代碼的部分,具有與此

Pattern p = Pattern.compile("<div class=\"title\" itemprop=\"name\">(.+?)</div> </td>"); 
    Matcher m = p.matcher(html); 
    while(m.find()) { 
     quote.add(m.group(1)); 
    } 

當它運行時,它顯示ArrayList引用中沒有任何內容。這可能不起作用,因爲它計算了兩者之間的空間。有任何想法嗎?

+0

嘗試使用[XPath的來代替。(http://docs.oracle.com/javase/7/docs/api/javax/xml/ xpath/package-summary.html) – jreut

回答

4

您可以使用jsoup解析以及下載HTML文檔:

String site = "http://example.com/"; 
Document doc = Jsoup.connect(site).get(); 
String text doc.select("div.title").first().text(); 

或者只是使用XPath,如果不工作。正則表達式非常適合從非結構化文本中挑選數據。但是,當您擁有像HTML這樣的結構化文檔時,您可以將所有繁重的工作都留給專門構建的解析器。 Java附帶javax.xml.xpath library,您可以使用它搜索文檔的節點樹。

比方說,你的文件看起來是這樣的:

<html> 
    <body> 
    <div class="title">Wrath</div> 
    </body> 
</html> 

你能做到這一點找到該div文本:

XPath xpath = XPathFactory.newInstance().newXPath(); 
String expression = "/html/body/div[@class='title']/text()"; 
InputSource inputSource = new InputSource("myDocument.html"); 
NodeList nodes = (NodeList) xpath.evaluate(expression, inputSource, XPathConstants.NODESET); 
+0

我不能使用第一部分,因爲我不知道憤怒已經在那裏,它可以是任何名字。至於你給我的XPath代碼,似乎我得到了一些錯誤,如malformedURLexcpetion:沒有協議:然後它顯示文件後 – Kasarrah

+2

我認爲你是從某個地方下載網頁?在這種情況下,你可以將你下載的'String'解析成一個JSOUP'Document',然後使用'doc.select(「div.title」)。text()'來獲得有問題的文本。 – jreut

+0

啊!這在很大程度上起作用,它獲得了所有的歌曲,只是一些額外的東西。非常感謝! – Kasarrah

0

如果分析如Perl,你可能不得不在翻倍在\

Pattern p = Pattern.compile("<div class=\"title\" itemprop=\"name\">(.*?)<\\/div>"); 

應該

Pattern p = Pattern.compile("<div class=\"title\" itemprop=\"name\">(.*?)<\\\\/div>"); 

但對於這種事情一個正則表達式是錯誤的工具

相關問題