2013-09-22 4 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는 t입니다. 'id' 속성이'text11' 인'div' 요소를 선택하려고 시도하지만, 참조 된 HTML 페이지에는 그러한 div 요소가 없습니다. (클래스 속성이'text11'으로 설정된 div 요소가 많이 있습니다.) 링크 된 HTML 페이지에서 선택할 데이터의 구체적인 예를 제공하면 XPath를 만드는 데 도움을 줄 수 있습니다. – kjhughes

+0

@kjhughes 나는 여전히 XPath를 배우려고 노력하고 있지만, 나는 항상 내가 알지 못하는 새로운 것을 배우는 데 문제가있다. 어떤 테이블 내용을 선택하는 방법에 대한 예를 보여 주시겠습니까? 어떻게 든 구조를 가져올 수 있도록 원하는 테이블 내용에 대한 XPath 코드를 보여주십시오. 고맙습니다. 감사합니다. – Guy

답변

0

내 생각 엔 문제가 여기에 XPath에있는 것입니다 : 나는 내 댓글에서 언급 한 바와 같이

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

에서, //div[@id='text11']의 XPath는 id 어떤 div 요소와 동일한 속성을 선택하려고 text11 그러나 참조 된 HTML 페이지에는 해당 div 요소가 없습니다.

테이블을 선택하는 방법에 대한 예제를 보여 주시겠습니까? 원하는 테이블 컨텐트에 대한 XPath 코드를 보여주십시오. 어떻게 든 구조체를 얻습니다. 예를 들어, "2 우라"를 포함하는 사업부를 선택하려면 HTML page you referenced를 사용

:

//*[@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 release notes] (http://htmlcleaner.sourceforge.net/release.php) (릴리스 2.0, 이후 개선 된 점은 없습니다)에 따르면, HTMLCleaner는 부분적으로 만 XPath를 구현합니다.내가 제공 한 XPath는 정확하며 Chrome에서 테스트되었습니다. 어쩌면 HTMLCleaner의 부분적인 XPath 구현에 어려움을 겪은 다른 사람들은 통찰력을 갖게 될지 모르겠다. 그러나 내 제안은 문제가 XPath 또는 도구의 표준 구현에 있는지 궁금하지 않은 곳에서 도구를 사용하는 것이다. – kjhughes

+0

고맙다. 나는 그 충고를 할 것이다. htmlcleaner로 htmlcleaner를 간단히 정리하고, jsoup로 파싱한다. – Guy

관련 문제