Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

PROBLEMA - NÃO CONSIGO PARSE UM HTML COMPLETAMENTE (WEB SCRAPING)

Boa noite a todos,

Gostaria de "parsear" uma página da web, só que ao fazer isso, algumas tags não aparecem, alguém saberia me dizer o porque disso ?

Métodos que já tentei:

[HTMLunit]

import java.util.List;

import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class MyScrapping {

    public static void main(String[] args) {
        new MyScrapping().pegaHtml();
    }


    public void pegaHtml() {
        WebClient client = new WebClient();  
        client.getOptions().setCssEnabled(false);  
        client.getOptions().setJavaScriptEnabled(false);  
        try {  
            String searchUrl = "http://www.guj.com.br/t/robo-para-busca-remota/136843";
          HtmlPage page = client.getPage(searchUrl);

          // Imprime todo o HTML
          System.out.println("PAGE: " + page.asXml());

          List<HtmlElement> items = (List<HtmlElement>)page.getByXPath("//*[@id=\"post_1\"]/div/div[2]/div[1]/div[2]/a");

          if(items.isEmpty()){  
              System.out.println("No items found !");
          }else{

          }
          for (HtmlElement item : items) {

          // Até aqui já imprime o conteúdo da tag buscada
          System.out.println("ITEM : " + item.asText());

 }

          System.out.println();
        }catch(Exception e){     
          e.printStackTrace();
        }
    }

[JSOUP]

import java.io.IOException;

import org.jsoup.select.Elements;

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

public class MyJsoup {

    public static void main(String[] args) {
        new MyJsoup().pegaTag();
    }

    public void pegaHtmlFull(){
        Document document;
        try {
            String url="http://www.guj.com.br/t/robo-para-busca-remota/136843";

            document = Jsoup.connect(url)
                    .header("Accept-Encoding", "gzip, deflate")
                    .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
                    .maxBodySize(0)
                    .timeout(600000)
                    .get();

            String question =document.toString();
            System.out.println(" whole content: "+question);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

    public void pegaTag() {
        try {
            Document document = Jsoup.connect("https://app.stpu.com.br/static/js/deal-439.min.js").get();

            String site = document.html();
            System.out.println("SITE: " + site); 
            Elements elementos = document.select("div[class='discount-price-text discount-price-from']"); //Get price
            if(elementos.isEmpty()) {
                System.out.println("ELEMENTOS VAZIOS");
            }

            for (Element e : elementos) {
                System.out.println("ELEMENTOS: " + e);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

[BUFFERED]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class MyBuffered {

     public static void main(String[] args) {
        URL url = null;
    //    File file = new File("C:\\TutorialArquivos\\page.html");
        try {
            url = new URL("https://www.peixeurbano.com.br/rio-de-janeiro/kilograma-vila-isabel/rodizio-de-pizzas-completoqyoq");
            new MyBuffered().getPage(url);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void getPage(URL url) throws IOException {
        BufferedReader in =
                new BufferedReader(new InputStreamReader(url.openStream()));

    //    BufferedWriter out = new BufferedWriter(new FileWriter(file));

        String inputLine;

        while ((inputLine = in.readLine()) != null) {

            // Imprime página no console
            System.out.println(inputLine);

            // Grava pagina no arquivo
      //      out.write(inputLine);
      //      out.newLine();
        }

        in.close();
//        out.flush();
//        out.close();
    }

Tentei por exemplo:

No site: https://www.peixeurbano.com.br/rio-de-janeiro/rio-water-planet/rio-water-planetnurx

Pegar a tag:

<p class="discount-price-text discount-price-from">
                            <span>R$ <span id="show-discount"><span class="js-deal-price"><span>34<span class="cents">,90</span></span></span></span></span>
                        </p>

No site: http://www.guj.com.br/t/robo-para-busca-remota/136843

Pegar a tag:

<span title="Jan 25, 2012 7:34 pm" data-time="1327527285000" data-format="tiny" class="relative-date">Jan '12</span>

Mas ao pegar o HTML nunca vem com essas tags, alguém teria uma ideia do porque ? Estou a semana toda tentando e nada.

Meu objetivo é pegar valores de um site, mas se tem tags que eu não consigo pegar não dará muito certo.

2 respostas
solução!

Oi Frank, tudo bem ?

Pode ser que essas tags sejam adicionadas em tempo de execução via algum ajax da vida, por isso não entrem no fonte diretamente pelas bibliotecas.

Uma coisa que você pode fazer é usar o selenium para gerar um crawler e "roubar" o código fonte da página, contudo ele demora um pouco mais para ser executado, mas deve solucionar seu problema.

Sim, era sobre isso mesmo, acabei pesquisando sobre logo depois, e vi que o JAVASCRIPT não era carregado quando pegava o HTML, mas resolve utilizando o HTMLUnit