Почему html-код в chrome devtools и html-код, анализируемый jsoup, различаются? - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь извлечь информацию о дате создания проблем с сайта проблемы HADOOP Jira (https://issues.apache.org/jira/projects/HADOOP/issues/HADOOP-16381?filter=allopenissues)

. Как вы видите на этом Снимок экрана , дата создания - это текст междуметка времени, класс которой является живой отметкой (например, <time class=livestamp ...> 'this text' </time>)

Итак, я попытался разобрать его с кодом, как показано ниже.

import java.io.IOException;

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

public class CreatedDateExtractor {
    public static void main(String[] args) {
        String url = "https://issues.apache.org/jira/projects/HADOOP/issues/HADOOP-16381?filter=allopenissues";
        Document doc = null;

        try {
            doc = Jsoup.connect(url).get();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Elements elements = doc.select("time.livestamp"); //This line finds elements that matches time tags with livestamp class
        System.out.println("# of elements : "+ elements.size());
        for(Element e: elements) {
            System.out.println(e.text());
        }   
    }
}



Я ожидаю, что созданная дата будет извлечена, нофактический результат равен # элементов: 0 .

Я обнаружил, что это что-то не так, поэтому я попытался проанализировать весь HTML-код с той стороны с приведенным ниже кодом.

import java.io.IOException;

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

public class CreatedDateExtractor {
    public static void main(String[] args) {
        String url = "https://issues.apache.org/jira/projects/HADOOP/issues/HADOOP-16381?filter=allopenissues";
        Document doc = null;

        try {
            doc = Jsoup.connect(url).get();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Elements elements = doc.select("*"); //This line finds whole elements in html document.
        System.out.println("# of elements : "+ elements.size());
        for(Element e: elements) {
            System.out.println(e);
        }   
    }
}

Я сравнил html-код в chrome devtools и html-код, который я анализировал один за другим. Затем я обнаружил, что они разные.

Можете ли вы объяснить, почему это происходит, и датьмне несколько советов, как извлечь дату создания?

Ответы [ 2 ]

0 голосов
/ 11 июля 2019
import Torello.HTML.*;
import Torello.HTML.NodeSearch.*;
import Torello.Java.*;

import java.util.*;
import java.io.*;
import java.net.*;

public class Scrape
{
    public static void main(String[] argv) throws IOException
    {
        // This URL does not appear to have an HTML Element with a "TimeStamp" as you have stated.
        // ==> Go to any browser and view it for yourself!  (Click "View Source" in Google-Chrome, I.E., Safari, etc...)
        // URL url = new URL("https://issues.apache.org/jira/projects/HADOOP/issues/HADOOP-16381?filter=allopenissues");

        URL url = new URL("https://some.url.org/");

        // This scrapes the web-page into a standard Java-Vector.
        // HTMLNode is abstract, and has only 2 classes that inherit it.  (3 actually, but one is the "CommentNode")
        Vector<HTMLNode> page = HTMLPage.getPageTokens(url, false);

        // This will output each & every node in the page to a text/html file called "output.html"
        // Read Documentation Files for "Util.pageToString" and "FileRW.writeFile"
        FileRW.writeFile(Util.pageToString(page), "output.html");

        // If this is the question to identify:
        // As you can see in this Screenshot, created date is the text between the time tag whose class is
        // live stamp(e.g. <time class=livestamp ...> 'this text' </time>)
        //
        // Using the "NodeSearch.InnerTagGetInclusive" class will retrieve the information you need
        Vector<HTMLNode> liveStamp = InnerTagGetInclusive.first(page, "time", "class", TextComparitor.CN_CI, "livestamp");

        // This will get eliminate of all the "TagNode" elements when building a this String.
        // It will leave you with only the "TextNode" elements.
        // This remaining TextNode's should, indeed, be the the "this text" as a string.
        String liveStampStr = Util.textNodesString(liveStamp);

        System.out.println("Live-Stamp: " + liveStampStr);
    }
}
0 голосов
/ 11 июля 2019

Я советую вам получить элементы с тегом "time" и использовать select для получения тегов времени, которые имеют класс "livestamp".Вот пример:

Elements timeTags = doc.select("time");
Element timeLivestamp = null;
for(Element tag:timeTags){
  Element livestamp = tag.selectFirst(".livestamp");
  if(livestamp != null){
   timeLivestamp = livestamp;
   break;
   }

}

Я не знаю почему, но когда я хочу использовать метод .select () Jsoup с более чем одним селектором (как вы использовали, например, time.livestamp), я получаюинтересные выводы, как это.

...