2014-07-25 1 views
1

description 태그에 저장하는 RSS의 정보를 읽는 중입니다. HTML 코드이며 일반 텍스트가 아닙니다. 첫 번째 이미지처럼 나타나는 정보를 추출 할 필요가 있지만 description 안에있는 모든 태그는 Jsoup에 의해 구문 분석되지 않기 때문에 CDATA 요소의 동작으로 가정 할 수 없습니다.대체없이 Jsoup로 CDATA 내의 태그를 자동으로 파싱하는 방법

내 질문에 나는 "자동 방법"을 보았 기 때문에 여기에 다른 질문이 있는데 나는 .replace()을 사용하여 CDATA를 제거했지만 특정 케이스에 도움이 될 것이라고 생각하는만큼 효과적인 솔루션이 아닌 것 같습니다. 범용 목적이 아닙니다. 그래서 제 질문은 Jsoup가 텍스트를 바꾸지 않고 파싱을 할 수있는 방법이 있다면 말입니까? 이것이 유일한 방법입니까? 다른 도서관을 사용해야합니까? 예를 들어

, 나는 RSS 문서를 구문 분석 할 때, 노드 설명이 있습니다

<table width='100%' border='0' cellspacing='0' cellpadding='4'><tr><td align='left' width='10'>< 
a href='http://www.3djuegos.com/noticia/145062/0/bioware-nuevo-juego-ip/video-gamescom/trailer/'><img src='http://i11c.3djuegos.com/juegos/7332/dragon_age_iii/fotos/noticias/dragon_age_iii-2583054.jpg' border='0' width='70' height='52' /> 
</a></td><td align='left' valign='top'>Parece ser una nueva licencia creativa, según lo visto en un enigm&aacu 

모든 특수 문자를 "<>"CDATA 그렇게 작동하기 때문에 scaped된다. 문서의 나머지 부분은 으로 잘 파싱되었습니다.은 CDATA 콘텐츠에서만 발생합니다. 내가 액세스에 사용

코드 :

doc = Jsoup.connect("http://www.3djuegos.com/universo/rss/rss.php?plats=1-2-3-4-5-6-7-34&tipos=noticia-analisis-avance-video-imagenes-demo&fotos=peques&limit=20").get(); 
System.out.println(doc.html()); // Shows the document well parsed. 

Elements nodes = doc.getElementsByTag("item"); // Access to news 
for(int i = 0; i < nodes.size(); i++){ // Loop all news 

    // Description node 
    Element decriptionNode = nodes.get(i).getElementsByTag("description").get(0); 

    // Shows content of node. Here is where HTML tags are escaped 
    System.out.println(nodes.get(i).getElementsByTag("description").html()); // Here prints the content of description tag and all HTML tags are escaped by default 

    // Access to first image and here fails because of description text is escaped 
    // and then Jsoup cant parsed as nodes 
    Element imageNode = descriptionNode.getElementsByTag("img").get(0); 
} 

편집 : doc.outputSettings().escapeMode(EscapeMode.xhtml) 사용하지만 나는 그것이 CDATA 내용에 영향을 미치지 않는 것으로 가정합니다.

Edit2 : unescape html을 허용하는 라이브러리 org.apache.commons.lang3.StringEscapeUtils의 해결 방법으로 사용하지만 Jsoup가 이미이 시나리오에 대해 뭔가를 가지고 있다면 여전히 생각하고 있습니다.

+0

구문 분석하려는 샘플 코드와 추출 할 항목의 샘플 코드를 제공해야합니다. –

+0

CDATA 문제로 업데이트되었습니다. – korima

+0

그리고 당신의 Jsoup 코드는 무엇입니까? –

답변

4

text() 메서드를 사용하면 이스케이프되지 않은 값을 가져올 수 있습니다. 즉 요소의 값이 &lt;table width='100%' border='0' cellspacing='0' cellpadding='4'&gt; 인 경우 element.text() 일 때 <table width='100%' border='0' cellspacing='0' cellpadding='4'>을 반환합니다. 그래서이 조각을 다시 파싱하여 원하는 것을 얻을 수 있습니다. 예 :

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 

public class Sample { 
    public static void main(String[] args) throws Exception { 
     String html = "<description>" 
         + "&lt;table width='100%' border='0' cellspacing='0' cellpadding='4'&gt;&lt;tr&gt;&lt;td align='left' width='10'&gt;&lt;" 
         + "a href='http://www.3djuegos.com/noticia/145062/0/bioware-nuevo-juego-ip/video-gamescom/trailer/'&gt;&lt;img src='http://i11c.3djuegos.com/juegos/7332/dragon_age_iii/fotos/noticias/dragon_age_iii-2583054.jpg' border='0' width='70' height='52' /&gt;" 
         + "&lt;/a&gt;&lt;/td&gt;&lt;td align='left' valign='top'&gt;Parece ser una nueva licencia creativa, seg&uacute;n lo visto en un enigm&aacu" 
        + "</description>"; 

     Document doc = Jsoup.parse(html); 
     for(Element desc : doc.select("description")){ 
      String unescapedHtml = desc.text(); 
      String src = Jsoup.parse(unescapedHtml).select("img").first().attr("src"); 
      System.out.println(src); 
     } 
     System.out.println("Done"); 
    } 

} 
+0

으로 업데이트되었습니다. 많은 감사드립니다! 나는 항상'html()'을 사용하고 있었고'text()'가 모두 이스케이프 처리되면 괜찮을 것이라고 기대하지 않았습니다! 나는 당신에게 표를 줄 것이지만 나는 명성이 충분하지가 않다. 다시 한 번 감사드립니다! – korima

+0

이것은 좋은 해결책입니다! +1 –

관련 문제