JSoup non in grado di ottenere link da html

0

Domanda

Sto cercando di ottenere link da html di un sito, ma è in grado di farlo utilizzando Jsoup.

Questo è il codice HTML:

<div class="anime_muti_link">
    <ul>
  <li><div class="doamin">Domain</div><div class="link">Link</div></li>
  <li class="anime">
    <a href="#" class="active" rel="1" data-video="example.com" ><div class="server m1">Server m1</div><span>Watch This Link</span></a>
  </li>
    
  <li class="anime">
    <a href="#" rel="1" data-video="example.com" ><div class="server m1">Server m2</div><span>Watch This Link</span></a>
  </li>
  
              <li class="xstreamcdn">
      <a href="#" rel="29" data-video="example.com">Xstreamcdn</div><span>Watch This Link</span></a>
    </li>
          <li class="mixdrop">
      <a href="#" rel="7" data-video="example.com"><div class="server mixdrop">Mixdrop</div><span>Watch This Link</span></a>
    </li>
          <li class="streamsb">
      <a href="#" rel="13" data-video="example.com">StreamSB</div><span>Watch This Link</span></a>
    </li>
          <li class="doodstream">
      <a href="#" rel="14" data-video="example.com">Doodstream</div><span>Watch This Link</span></a>
    </li>
  
</ul>
</div>

Questo è il codice di android che ho scritto che non sembra funzionare:

try {
                Document doc = Jsoup.connect(URL).get();
                Elements content = doc.getElementsByClass("anime_muti_link");
                Elements links = content.select("a");

                String[] urls = new String[links.size()];
                for (int i = 0; i < links.size(); i++) {
                    urls[i] = links.get(i).attr("data-video");
                    if (!urls[i].startsWith("https://")) {
                        urls[i] = "https:" + urls[i];
                    }
                }
                arrayList.addAll(Arrays.asList(urls));
                Log.d("CALLING_URL", "Links: " + Arrays.toString(urls));

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

Per favore qualcuno può aiutarmi con questo? Grazie

Edit: in pratica sto cercando di ottenere quei 6 collegamenti e aggiungere alla mia lista di utilizzare all'interno della app.

Edit 2:

Così ho trovato un altro codice HTML che può sembra migliore:

<div class="heading-servers">
     <span><i class="fa fa-signal"></i> Servers</span>
     <ul class="servers">
      <li data-vs="https://example.com" class="server server-active" style="display: block;" onclick="return loadIframe('ifrm', this.getAttribute('data-vs'));">Netu</li>
      <li data-vs="https://example.com" class="server" style="display: block;" onclick="return loadIframe('ifrm', this.getAttribute('data-vs'));">VideoVard</li>
      <li data-vs="https://example.com" class="server" style="display: block;" onclick="return loadIframe('ifrm', this.getAttribute('data-vs'));">Doodstream</li>
      <li data-vs="https://example.com" class="server" style="display: block;" onclick="return loadIframe('ifrm', this.getAttribute('data-vs'));">Okstream</li>
     </ul>
    </div>
android android-studio java jsoup
2021-11-23 21:52:18
1

Migliore risposta

2

Come si può vedere, in questo li definizione sono compresi nidificata div:

<li class="xstreamcdn">
      <a href="#" rel="29" data-video="example.com">Xstreamcdn</div><span>Watch This Link</span></a>
    </li>

Questa è la causa che il contenuto variabile, il frammento di HTML con classe anime_muti_linka guardare come:

<div class="anime_muti_link"> 
 <ul> 
  <li>
   <div class="doamin">
    Domain
   </div>
   <div class="link">
    Link
   </div></li> 
  <li class="anime"> <a href="#" class="active" rel="1" data-video="example.com">
    <div class="server m1">
     Server m1
    </div><span>Watch This Link</span></a> </li> 
  <li class="anime"> <a href="#" rel="1" data-video="example.com">
    <div class="server m1">
     Server m2
    </div><span>Watch This Link</span></a> </li> 
  <li class="xstreamcdn"> <a href="#" rel="29" data-video="example.com">Xstreamcdn</a></li>
 </ul>
</div>

Un simile risultato sarà ottenuto anche se avete ordinato il vostro HTML. Ho usato questo codice da una delle mie risposte precedenti:

Tidy tidy = new Tidy();
tidy.setXHTML(true);
tidy.setIndentContent(true);
tidy.setPrintBodyOnly(true);
tidy.setInputEncoding("UTF-8");
tidy.setOutputEncoding("UTF-8");
tidy.setSmartIndent(true);
tidy.setShowWarnings(false);
tidy.setQuiet(true);
tidy.setTidyMark(false);

org.w3c.dom.Document htmlDOM = tidy.parseDOM(new ByteArrayInputStream(html.getBytes()), null);

OutputStream out = new ByteArrayOutputStream();
tidy.pprint(htmlDOM, out);
String tidiedHtml = out.toString();
// System.out.println(tidiedHtml);

Document document = Jsoup.parse(tidiedHtml);
Elements content = document.getElementsByClass("anime_muti_link");
System.out.println(content);

E questo è il motivo per cui si vengono a trovare solo tre punti di ancoraggio.

Per favore, prova a correggere il tuo HTML o selezionando il tag di ancoraggio come il livello di documento, invece:

Document document = Jsoup.parse(html);
// Elements content = document.getElementsByClass("anime_muti_link");
// System.out.println(content);
Elements links = document.select("a");

String[] urls = new String[links.size()];
for (int i = 0; i < links.size(); i++) {
  urls[i] = links.get(i).attr("data-video");
  if (!urls[i].startsWith("https://")) {
    urls[i] = "https://" + urls[i];
  }
}
System.out.println(Arrays.asList(urls));

Se il risultato ottenuto contiene collegamenti indesiderati, forse si può provare a ridurre il selettore usato, qualcosa di simile a:

document.select(".anime_muti_link a")

Se questo non funziona, un'altra possibile alternativa potrebbe essere la selezione di elementi di ancoraggio con un data-video attributo, a[data-video]:

Document document = Jsoup.parse(html);
Elements videoLinks = document.select("a[data-video]");

String[] urls = new String[videoLinks.size()];
for (int i = 0; i < videoLinks.size(); i++) {
  urls[i] = videoLinks.get(i).attr("data-video");
  if (!urls[i].startsWith("https://")) {
    urls[i] = "https://" + urls[i];
  }
}
System.out.println(Arrays.asList(urls));

Con il nuovo test, è possibile ottenere le informazioni desiderate con un codice simile a questo:

String html = "<div class=\"heading-servers\">\n" +
    "     <span><i class=\"fa fa-signal\"></i> Servers</span>\n" +
    "     <ul class=\"servers\">\n" +
    "      <li data-vs=\"https://example.com\" class=\"server server-active\" style=\"display: block;\" onclick=\"return loadIframe('ifrm', this.getAttribute('data-vs'));\">Netu</li>\n" +
    "      <li data-vs=\"https://example.com\" class=\"server\" style=\"display: block;\" onclick=\"return loadIframe('ifrm', this.getAttribute('data-vs'));\">VideoVard</li>\n" +
    "      <li data-vs=\"https://example.com\" class=\"server\" style=\"display: block;\" onclick=\"return loadIframe('ifrm', this.getAttribute('data-vs'));\">Doodstream</li>\n" +
    "      <li data-vs=\"https://example.com\" class=\"server\" style=\"display: block;\" onclick=\"return loadIframe('ifrm', this.getAttribute('data-vs'));\">Okstream</li>\n" +
    "     </ul>\n" +
    "    </div>";

Document document = Jsoup.parse(html);
Elements videoLinks = document.select("div.heading-servers ul.servers li.server");

String[] urls = new String[videoLinks.size()];
for (int i = 0; i < videoLinks.size(); i++) {
  urls[i] = videoLinks.get(i).attr("data-vs");
  if (!urls[i].startsWith("https://")) {
    urls[i] = "https://" + urls[i];
  }
}

System.out.println(Arrays.asList(urls));

La parte più importante è la definizione del selettore che deve essere applicato per il documento analizzato, div.heading-servers ul.servers li.server nel nostro caso.

Ho fornito un selettore con molti frammenti, ma a seconda dell'effettivo utilizzo HTML potrebbe essere semplificata con ul.servers li.server o anche li.server.

2021-12-01 22:21:33

Non riesco a modificare l'HTML come questo non è il mio sito web. Proverò la tua soluzione, grazie!
Meggan Sam

Sei il benvenuto @MegganSam, spero che aiuta. Ho aggiornato la risposta di fornire un feedback su come eventualmente restringere il selettore in caso si ottiene indesiderati link. Non ho testato questo ultimo aggiornamento. Spero che aiuta.
jccampanero

@MegganSam sono Stati in grado di testare la soluzione proposta? Ha funzionato?
jccampanero

Ci ho provato, sì. Purtroppo, non funziona :(
Meggan Sam

Mi dispiace sentire che. Suppongo che abbia a che fare con l'elaborazione di tutto il documento HTML. Ho aggiornato la risposta cercando di fornire un'alternativa. Per favore, potresti provare? Spero che aiuta.
jccampanero

Grazie per aver cercato di aiutare, ma sembra che l'HTML non è scritto bene, così ho modificato la mia domanda con un'altra che ha il bambino di classi troppo, così si può forse aiutarmi con questo? Ho provato la soluzione con quella nuova, ma che non funziona purtroppo
Meggan Sam

Sei il benvenuto. Sì, sono d'accordo con te Meggan, probabilmente ci deve essere qualcosa di sbagliato nel codice HTML. Per quanto riguarda l'edizione, ho aggiornato la mia risposta con una possibile soluzione. Per favore, potresti provare?
jccampanero

Ha funzionato, omg, grazie una tonnellata!!!
Meggan Sam

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................