JSoup nu capabil de a obține link-uri de html

0

Problema

Eu sunt încercarea de a obține link-uri de html de pe un site dar nu poate să o facă folosind Jsoup.

Aceasta este 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>

Acesta este codul android pe care am scris-care nu pare să funcționeze:

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();
            }

Poate cineva să mă ajute cu asta? Multumesc

Edit: de Fapt eu sunt încercarea de a obține cele 6 link-uri și să le adăugați la lista mea să-l folosească în cadrul aplicației.

Edit 2:

Așa că am găsit o altă HTML care poate pare mai bine:

<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

Cel mai bun răspuns

2

După cum puteți vedea, în acest li definiție, inclusiv un imbricate div:

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

Aceasta este cauza care conținutul variabil, fragmentul HTML cu clasa anime_muti_link, pentru a arata ca:

<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 rezultat similar va fi obținut chiar dacă-ți faci ordine în HTML. Am folosit acest cod de la unul din răspunsurile precedente:

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);

Și acest lucru este de ce sunt găsirea doar trei ancore.

Te rog, încearcă corectarea HTML sau selectarea tag-ul ancora ca document de nivel:

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));

Dacă rezultatul obținut conține link-uri nedorite, poate puteți încerca îngustarea selectorul de folosit, ceva de genul:

document.select(".anime_muti_link a")

Dacă acest lucru nu funcționează, o altă alternativă posibilă ar putea fi selectarea elemente de ancorare cu o data-video atribut, 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));

Cu noul test, puteți obține informațiile dorite cu un cod similar:

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));

Partea cea mai importantă este definirea selector care ar trebui să fie aplicate analizat documentul, div.heading-servers ul.servers li.server în cazul nostru.

I-am oferit un selector cu mai multe fragmente, dar în funcție de utilizarea efectivă HTML ar putea fi simplificată cu ul.servers li.server sau chiar li.server.

2021-12-01 22:21:33

Eu nu pot schimba HTML ca asta nu e site-ul meu. Voi încerca o altă soluție, multumesc!
Meggan Sam

Sunteți bineveniți @MegganSam, sper că vă ajută. Am actualizat răspunsul pentru a oferi feedback despre cum să-și, eventual înguste selectorul în cazul în care puteți obține link-uri nedorite. Nu am testat acest ultim update. Sper că vă ajută.
jccampanero

@MegganSam ai Fost capabil de a testa soluția propusă? A funcționat?
jccampanero

Am încercat, da. Din păcate, nu merge :(
Meggan Sam

Îmi pare rău să aud asta. Cred că are de-a face cu prelucrarea întregul document HTML. Am actualizat răspunsul încearcă oferind o altă alternativă. Te rog, ai putea încerca? Sper că vă ajută.
jccampanero

Vă mulțumim pentru încercarea de a ajuta, dar se pare ca HTML în sine nu e scris bine, așa că am editat întrebarea mea cu un altul care are clase pentru copii prea, așa că poate te poate ajuta cu asta? Am încercat soluția pe unul nou, dar nici asa nu merge din pacate
Meggan Sam

Sunteți bineveniți. Da, sunt de acord cu tine Odell, probabil, ar trebui să fie ceva greșit în HTML. Cu privire la ediție, am actualizat răspunsul meu cu o soluție posibilă. Te rog, ai putea încerca?
jccampanero

Ea a lucrat, omg, multumesc mult!!!
Meggan Sam

În alte limbi

Această pagină este în alte limbi

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