2015-01-06 3 views
-2

jsoup를 사용하여 URL을 가져 와서 어떤 이유로 든 해당 URL에서 imadge를 다운로드하려고합니다.jsoup로 html에서 URL 가져 오기

a href="http://www.google.co.il/imgres?imgurl=http://michellepicker.files.wordpress.com/2011/03/grilled-chicken-mexican-style.jpg&imgrefurl=http://michellepicker.wordpress.com/2011/04/25/grilled-chicken-mexican-style-black-beans-guacamole/&h=522&w=700&tbnid=4hXCtCfljxmJXM:&zoom=1&docid=ajIrwZMUrP5_GM&ei=iVOqVPmDDYrnaJzYgIAM&tbm=isch" 

은 이것이다 : 바로 다음에 오는 URL을 가져 오기 위해 "DIV 클래스 ="rg_di "가", 처음으로 HTML 파일에 을 표시되는 위치를 찾기 위해 먼저 노력하고 이상하고

보기 소스 : html로의 URL

try 
     { 
      doc = Jsoup.connect(url).get(); 
      Element link = doc.select("div.rg_di").first(); 
      Element link2 = link.select("a").first(); 
      String relHref = link2.attr("href"); // == "/" 
      String absHref = link.attr("abs:href"); 
      tmpResult = absHref; 



     } 
     catch (Exception e) 
     { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 
,691 : 여기 https://www.google.co.il/search?q=grilled+mexican+chicken&es_sm=93&source=lnms&tbm=isch&sa=X&ei=h1OqVOH6B5bjaqGogvAP&ved=0CAgQ_AUoAQ&biw=1920&bih=955

내가 노력 코드입니다 363,210

전체 활동 코드 :

doc = Jsoup.connect(url).get(); 

쓰기 :이의 403

대신 오류를 제거하는 코드를 편집 도움

+0

_error 403_가 표시 되나요? – gkiko

+0

문제를 해결 했습니까? – gkiko

답변

4

에 대한

package com.androidbegin.parselogintutorial; 

import com.androidbegin.parselogintutorial.SingleRecipe.urlTask; 
import com.gargoylesoftware.htmlunit.BrowserVersion; 
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; 
import com.gargoylesoftware.htmlunit.WebClient; 
import com.gargoylesoftware.htmlunit.html.HtmlPage; 
import com.koushikdutta.urlimageviewhelper.sample.UrlImageViewHelperSample; 
import com.parse.GetCallback; 
import com.parse.ParseException; 
import com.parse.ParseObject; 
import com.parse.ParseQuery; 
import com.parse.ParseUser; 
public class Bla extends Activity 
{ 
    ImageView iv,bm; 
    TextView recipeTitle; 
    String urlForImage = ""; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.bla_layout); 
     new urlTask("grilled mexican chicken").execute("grilled mexican chicken"); 
     //new DownloadImageTask((ImageView)findViewById(R.id.RecipeImage)).execute(urlForImage); 
    } 
    public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> 
    { 
     ImageView bmImage; 
     public DownloadImageTask(ImageView bmImage) { 
      this.bmImage = bmImage; 
     } 
     protected Bitmap doInBackground(String... urls) 
     { 
      String urldisplay = urls[0]; 
      Bitmap mIcon11 = null; 
      try 
      { 
       InputStream in = new java.net.URL(urldisplay).openStream(); 
       mIcon11 = BitmapFactory.decodeStream(in); 
       in.close(); 
      } 
      catch (Exception e) 
      { 
       Log.e("Error", e.getMessage()); 
       e.printStackTrace(); 
      } 
      return mIcon11; 
     } 
     protected void onPostExecute(Bitmap result) 
     { 
      bmImage.setImageBitmap(result); 
     } 
    } 
    public class urlTask extends AsyncTask<String, Void, String> 
    { 
     String str; 
     public urlTask(String str) 
     { 
      this.str = str; 
     } 
     String tmpResult = str; 
     Document doc; 
     protected String doInBackground(String... urls) 
     { 
      String urldisplay = urls[0]; 
      String url = "https://www.google.co.il/search?q=grilled+mexican+chicken&es_sm=93&source=lnms&tbm=isch&sa=X&ei=h1OqVOH6B5bjaqGogvAP&ved=0CAgQ_AUoAQ&biw=1920&bih=955"; 
      WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24); // Chrome not working 
      HtmlPage page = null; 
      try 
      { 
       page = webClient.getPage(url); 
      } catch (FailingHttpStatusCodeException e1) 
      { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      catch (MalformedURLException e1) 
      { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      catch (IOException e1) 
      { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      try 
      { 
       Document doc = Jsoup.parse(page.asXml()); 
       Elements divs = doc.select(".rg_di"); 
       for(Element div : divs) 
       { 
        Element img = div.select("a").get(0); 
        String link = img.attr("href"); 
        System.out.println(link); 
       } 

      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
      return tmpResult; 
     } 
     protected void onPostExecute(String result) 
     { 
      result = tmpResult; 
      urlForImage = tmpResult; 
     } 
    } 
} 

감사 this :

doc = Jsoup.connect(url).userAgent("Mozilla").get(); 

link은 동적으로 생성 된 것으로 보입니다. Jsoup 그러므로 .rg_di 클래스,

doc.select("div.rg_di").first(); 

반환 널 (null)을 포함하지 않는 HTML을 가져와 우리는 NullPointerException이 얻을.

HTML은 우리가 할 수있는 베스트이다

<img height="104" src="https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcT-pctOxpuUcdq118aFU3s2miRfUa6Ev8eF-UsxARHV-vbcOUV8byEtt2YT" width="140"> 

모든 img 태그를 얻고 우리가 분석하는 다양한 솔루션이 있습니다 아이콘 목록이

Document doc = Jsoup.connect(url).userAgent("Mozilla").get(); 
Elements imgs = doc.select("img"); 
for(Element img : imgs){ 
    String link = img.attr("src"); 
    System.out.println(link); 
} 

/textinputassistant/tia.png 
https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcT-pctOxpuUcdq118aFU3s2miRfUa6Ev8eF-UsxARHV-vbcOUV8byEtt2YT 
https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcQMq354p43ddqPcpV9-q_05YkmY7XUPgv6Sl2oQLqFxQ5-IkpGAAuFTLMM 
https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcTW-RinkkW_fBdlHzTJn6vNmR85TR58geQgfjQnEJmOqzjq0Oi-z-8zXjg 
https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcRUXLzKi3UyQ6mF9JD20Z1jYNhVxQz7tkhJIEGOL3kua8ptoQrvo8-Nco_X 
https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcTverQlzF_hauCabscWF4wHLb_q7g9M_UDKO6LaldSRHhsTj7CxtVF2yvc 
... 

을 연결 얻을 그들을 반복하는 jsoup에 의해 다운로드 니펫 동적 콘텐츠.link

나는 페이지를 렌더링하는 HtmlUnit과을 구현 한

편집

import java.io.IOException; 
import java.net.MalformedURLException; 

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

import com.gargoylesoftware.htmlunit.BrowserVersion; 
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; 
import com.gargoylesoftware.htmlunit.WebClient; 
import com.gargoylesoftware.htmlunit.html.HtmlPage; 


public class Main { 
    public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException { 
     String url = "https://www.google.co.il/search?q=grilled+mexican+chicken&es_sm=93&source=lnms&tbm=isch&sa=X&ei=h1OqVOH6B5bjaqGogvAP&ved=0CAgQ_AUoAQ&biw=1920&bih=955"; 
     WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24); // Chrome not working 
     HtmlPage page = webClient.getPage(url); 
     try { 
      Document doc = Jsoup.parse(page.asXml()); 
      Elements divs = doc.select(".rg_di"); 
      for(Element div : divs){ 
       Element img = div.select("a").get(0); 
       String link = img.attr("href"); 
       System.out.println(link); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

HtmlUnit과는 자신의 HTML 구문 분석 API를 가지고 있지만, 좀 더 직관적 jsoup

을 맡기 겠소

수정 2

는만큼 당신의 목표는 렌더링 및 안드로이드 장치 HtmlUnit과에 HTML 페이지를 구문 분석하는 것입니다으로 source

HtmlUnit과 안드로이드에 사용할 수없는 Java 클래스를 사용하는 좋은 옵션이 아닙니다. 그 외에, HtmlUnit은 다른 라이브러리를 사용합니다. 일부 라이브러리는이 라이브러리에 대한 종속성을 가질 수 있습니다. 그래서 HmlUnit만큼 멋진데, 안드로이드에서 실행되도록하는 것이 쉬운 일이 아닐 수도 있습니다.

  • 당신은 솔루션의 this 종류를 시도 할 수 있습니다. 또는
  • 자신을 고문하고 this 해결책을 시도해보십시오 (그렇지 않을 수도 있습니다).
    1. 가 웹 페이지를 렌더링하고 그것을 구문 분석 자바 서버를 만들 : 당신이 고려에 this 사람의 경험을 가지고가는 경우에 당신이 당신의 소프트웨어 아키텍처를 재 설계하는 경우 또는
    2. , 그것은 더 좋을 것이다. HTMLUnit + Jsoup
    3. 구문 분석 된 데이터를 서버의 파일 시스템에 JSON 형식으로 저장합니다. Gson
    4. android 앱이 JSON 파일을 요청할 때 JSON 파일을 보내는 서블릿을 만듭니다.
+0

답장을 보내 주셔서 대단히 감사합니다! 나는 link.it에서 모든 답을 보려고 노력한다. 매우 복잡하다. "httmlunit"조차도 구현 방법을 이해하기 쉽지 않다. httmlunit을 사용하여 작업 샘플을 게시 할 수있는 기회가 있는가? – maor

+0

@maor 나는 자유 시간을 얻 자마자 htmlunit을 사용하는 방법을 알아낼 것입니다. – gkiko

+0

대단히 감사합니다! – maor