2013-09-22 196 views
0

所以我正在學習如何使用XPath和HtmlCleaner來解析HTML,但我有一個問題。這是代碼:使用XPath導致問題

public class ScheudeleWithDesign extends Activity { 

static final String urlToParse = "https://www.easistent.com/urniki/263/razredi/18221"; 
static final String xpathTableContents = "//div[@id='text11']"; 
TextView tw1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_scheudele_with_design); 

    tw1 = (TextView) findViewById(R.id.urnikText); 

    String value = ""; 
    value = new getScheudele().execute().toString(); 
    tw1.setText(value); 

}//End of onCreate 

private class getScheudele extends AsyncTask<Void, Void, String> { 

    @Override 
    protected String doInBackground(Void... params) { 
     String stats = null; 

     //cleaner properties 
     HtmlCleaner cleaner = new HtmlCleaner(); 
     CleanerProperties props = cleaner.getProperties(); 
     props.setAllowHtmlInsideAttributes(false); 
     props.setAllowMultiWordAttributes(false); 
     props.setRecognizeUnicodeChars(true); 
     props.setOmitComments(true); 

     URL url; 
     try { 
      url = new URL(urlToParse); 
      TagNode root = cleaner.clean(url); 
      Object[] node = root.evaluateXPath(xpathTableContents); 
      //Vzemi podatke če najdeš element 
      if (node.length > 0) { 
       TagNode resultNode = (TagNode)node[10]; 
       stats = resultNode.getText().toString(); 
      } 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (XPatherException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return stats; 
    } 

} 

所以我很明顯試圖解析某些數據並將其設置爲textview。這不,雖然工作,結果是完全錯誤的:

[email protected]90

我的猜測是,這個問題是在這裏的XPath:

static final String xpathTableContents = "//div[@id='text11']"; 

我從來沒有使用XPath之前,所以我幾乎可以肯定我搞砸了那部分。 This is the site我想從中解析數據。這段代碼應該只有一個表格元素供初學者使用,一旦我知道如何去做,我將解析整個表格。

+1

''// div [@ id ='text11']「'XPath is t試圖選擇任何'id'屬性等於'text11'的div元素,但是在被引用的HTML頁面中沒有這樣的div元素。 (有很多div元素,其class屬性設置爲'text11'。)如果您提供了一個特定的數據示例,您希望從鏈接的HTML頁面中選擇數據,我們可以幫助您製作XPath。 – kjhughes

+0

@kjhughes我仍在嘗試學習XPath,但我總是遇到一個問題,學習了一些我一無所知的新東西。你能給我一個關於如何選擇任何表格內容的例子嗎?只需向我展示一個XPath代碼,以獲取您需要的任何表格內容,以便以某種方式「獲取結構」。我非常感謝,謝謝! – Guy

回答

0

我的猜測是,這個問題是在XPath這裏:

static final String xpathTableContents = "//div[@id='text11']"; 

正如我在我的評論中提到,該//div[@id='text11'] XPath是試圖選擇任何div元素與id屬性等於text11,但是在引用的HTML頁面中沒有這樣的div元素。

請給我看一個關於如何選擇任何表 內容的例子嗎?只是告訴我一個XPath代碼,用於任何你想要的表格內容,因此 我以某種方式「得到結構」。

使用HTML page you referenced,選擇包含 「2.市建局」 的DIV,例如:

//*[@id="seznam_ur_teden"]/table/tbody/tr[3]/td[1]/div[1] 

只選擇有文字,

//*[@id="seznam_ur_teden"]/table/tbody/tr[3]/td[1]/div[1]/text() 

要選擇整個祠堂表格:

//*[@id="seznam_ur_teden"]/table 
+0

謝謝您的回答,並且對於遲到的回覆感到抱歉,由於某種原因,我沒有在我的通知中看到它。我嘗試了所有這3個代碼,但都沒有工作。第一個錯誤是因爲「seznam_ur_teden」,因爲「不能在裏面」。所以我改了「with」,但它仍然不起作用。 – Guy

+0

根據[HTMLCleaner發行說明](http://htmlcleaner.sourceforge.net/release.php)(2.0版本,但沒有改進註釋), HTMLCleaner僅部分實現XPath。我提供的XPath是正確的,並在Chrome中進行了測試。也許有人在HTMLCleaner的部分XPath實現中掙扎了一下,但我的建議是使用一個工具,在這裏你不會懷疑XPath的問題還是工具的標準實現。 – kjhughes

+0

謝謝,我會採取這個建議:)我只是簡單地用htmlcleaner清理我的html,然後用jsoup解析它,如果這可以工作。 – Guy