Android에서 HTML 구문 분석


83

웹 페이지에서 Android의 HTML을 구문 분석하려고하는데 웹 페이지가 제대로 형성되지 않았기 때문에 SAXException.

Android에서 HTML을 구문 분석하는 방법이 있습니까?


Rhino 의존성이 Android에서 컴파일하기 위해 htmlunit 지옥을 만들 것이라고 생각하지만 시도해 볼 수 있습니다. 또한 수프와 같은 다른 비 엄격 HTML 파서도 작동 할 수 있습니다.
alex

여기서 웹킷을 사용할 수 있는지 궁금합니다.
ziya

답변:


71

이 문제가 발생했습니다. 몇 가지 시도했지만 JSoup 사용하기로 결정했습니다 . 항아리는 약 132k로 약간 크지 만 소스를 다운로드하고 사용하지 않을 방법 중 일부를 꺼내면 그다지 크지 않습니다.
=> 좋은 점은 형식이 잘못된 HTML을 처리한다는 것입니다.

다음은 해당 사이트의 좋은 예입니다.

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

//http://jsoup.org/cookbook/input/load-document-from-url
//Document doc = Jsoup.connect("http://example.com/").get();

Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
  String linkHref = link.attr("href");
  String linkText = link.text();
}

1
전체 jar를 포함하고 프로덕션 릴리스의 앱에서 ProGuard를 실행하여 사용하지 않는 코드를 제거 할 수 있습니다.
Andrew Mackenzie

3
주의 : JSoup은 매우 느립니다.
케빈

@kevin 그 주장에 대한 출처? 일부 디버깅을 활성화했을 수 있습니다.
goetzc

클라이언트 측에서 html 페이지를 렌더링하는 동안 Java 스크립트를 사용하여 동적으로로드 된 컨텐츠는 어떻습니까? Jsoup도이 콘텐츠를 보여줄까요?
MikeL 2016

56

Html.fromHtml (source)를 사용해 보셨습니까 ?

클래스는 소스 품질과 관련하여 상당히 자유 롭다고 생각합니다 ( 실제 나쁜 HTML을 염두에두고 설계된 TagSoup을 내부적으로 사용합니다 ). 그러나 모든 HTML 태그를 지원하지는 않지만 이해하지 못하는 태그에 반응하도록 구현할 수있는 핸들러가 함께 제공됩니다.


1
이것은 매우 간단합니다. 정확한 것을 검색 할 수 없습니다 (예 : XPATH)

주의하십시오. "모든 스레드를 일시 중단"합니다. 나는 그것에 html 형식 텍스트가있는 json을 얻을 때보 다 직면합니다. html 텍스트를 올바르게 표시하는 데 문제가 없었지만 html.fromhtml ()을 사용한 후에 나는 이것을 직면했습니다.
David

23
String tmpHtml = "<html>a whole bunch of html stuff</html>";
String htmlTextStr = Html.fromHtml(tmpHtml).toString();

멋지고 간단하며 플러그인이 없습니다. tnxs
RonEskinder 2015

1
참고로 : 전화 toString()Spanned에서 반환 된 객체 것은 Html.fromHtml(str)의 많은 것 HTML(포함하지 작업 태그 <i> <u> <b>). 따라서 textview를 설정하는 경우 다음을 수행하십시오.myTextView.setText(Html.fromHtml(str))
Sakiboy

@Sakiboy 당신이 맞아요. 이 외에도에서 작동하지 않는 다른 많은 태그가 Html.fromHtml()있습니다. 이 아웃 확인 stackoverflow.com/a/3150456/1987045
라훌 레브 앤드 란

멋진, 내가 원하는 정확히, 내 서버 측 dev에 지금은 쉽게 원시 문자열 감사로 변환 할 수 있습니다, 내가 html로 전송 한
Zulqurnain Jutt

3

우리 모두는 프로그래밍이 무한한 가능성을 가지고 있다는 것을 알고 있습니다. 단일 문제에 대해 사용할 수있는 솔루션이 많기 때문에 위의 모든 솔루션이 완벽하고 누군가에게 도움이 될 수 있다고 생각합니다.

따라서 코드는 다음과 같습니다.

  private void getWebsite() {
    new Thread(new Runnable() {
      @Override
      public void run() {
        final StringBuilder builder = new StringBuilder();

        try {
          Document doc = Jsoup.connect("http://www.ssaurel.com/blog").get();
          String title = doc.title();
          Elements links = doc.select("a[href]");

          builder.append(title).append("\n");

          for (Element link : links) {
            builder.append("\n").append("Link : ").append(link.attr("href"))
            .append("\n").append("Text : ").append(link.text());
          }
        } catch (IOException e) {
          builder.append("Error : ").append(e.getMessage()).append("\n");
        }

        runOnUiThread(new Runnable() {
          @Override
          public void run() {
            result.setText(builder.toString());
          }
        });
      }
    }).start();
  }

당신은 위의 함수를 호출 할 필요가 onCreate Method당신의MainActivity

나는 이것이 당신들에게도 도움이되기를 바랍니다.

또한 Medium 에서 원본 블로그를 읽으십시오.


1

WebView를 사용할 수 있지만 문서에서 볼 수 있듯이 WebView는 기본적으로 자바 스크립트 및 위젯과 같은 기타 항목을 지원하지 않습니다.

http://developer.android.com/reference/android/webkit/WebView.html

필요한 경우 javascript를 활성화 할 수 있다고 생각합니다.


4
예, JS를 쉽게 활성화 할 수 있습니다. 그러나 html 구문 분석을 위해 webview를 사용할 필요가 없습니다.
Guy

1
그 질문에 대답하지 않습니다
luckyhandler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.