JSoup nie je schopný získavať odkazy z html

0

Otázka

Snažím sa získavať odkazy z html stránky, ale nemôže tak urobiť pomocou Jsoup.

Toto je 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>

Toto je android kód, ktorý som napísal, ktorá sa nezdá práce:

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

Môže niekto prosím, pomôžte mi s tým? Vďaka

Edit: v Podstate sa snažím dostať týchto 6 odkazy a pridať ich do svojho zoznamu na používanie v aplikácii.

Edit 2:

Tak som zistil, iný HTML, ktorý možno vyzerá lepšie:

<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

Najlepšiu odpoveď

2

Ako môžete vidieť v tomto li definícia ste vrátane vnorených div:

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

To je príčinou, že obsah premennej, HTML fragmentu s triedy anime_muti_linkchcete vyzerať takto:

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

Podobné výsledky sa budú získavať aj keď ste tidy HTML. Použil som tento kód od jedného z mojich predchádzajúcich odpovedí:

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

A to je dôvod, prečo ste nájsť len tri kotvy.

Prosím, skúste oprava vášho HTML alebo výberom kotva značky úrovni dokumentu namiesto:

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

Ak výsledky získané obsahuje nežiadúce odkazy, možno si môžete vyskúšať zúženie výberu použité, niečo ako:

document.select(".anime_muti_link a")

Ak to nepomôže, ďalšou možnou alternatívou by mohol byť výber kotviace prvky s data-video atribút, 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));

S vaše nové test prípade, môžete získať požadované informácie s veľmi podobné kód:

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

Najdôležitejšou časťou je definícia voliča , ktorý by mal byť aplikovaný na analyzovaný dokument, div.heading-servers ul.servers li.server v našom prípade.

I za predpokladu výberu s mnohými fragmenty, ale v závislosti od skutočného využitia HTML by to mohlo byť zjednodušený s ul.servers li.server alebo aj li.server.

2021-12-01 22:21:33

Nemôžem zmeniť HTML tak, že to nie je moje webové stránky. Budem sa snažiť vašu iné riešenie, vďaka!
Meggan Sam

Rado @MegganSam, dúfam, že to pomôže. Aktualizoval som odpoveď poskytnúť spätnú väzbu o tom, ako možno zúžiť výber v prípade, že chcete získať nežiadúcich väzieb. Nemám to skúša poslednej aktualizácie. Dúfam, že to pomôže.
jccampanero

@MegganSam ste Boli schopní test navrhované riešenie? Urobil to funguje?
jccampanero

Som si vyskúšať, áno. Bohužiaľ, nefunguje :(
Meggan Sam

Ospravedlňujem sa, počuť, že. Myslím, že to má čo do činenia s spracovaní celého dokumentu HTML. Aktualizoval som odpoveď sa snaží poskytovať inú alternatívu. Prosím, mohli by ste to skúsiť? Dúfam, že to pomôže.
jccampanero

Vďaka za snaží pomôcť, ale zdá sa, že tento HTML sám nie je napísaný dobre, tak som upravených moja otázka s ešte jednu, ktorá má dieťa triedy príliš, takže môžete možno mi pomôcť s tým? Snažil som sa vás riešenie na nové, ale ani to nepomôže smutne
Meggan Sam

Rado sa stalo. Áno, súhlasím s vami Meggan, pravdepodobne tam by malo byť niečo zlé v HTML. Pokiaľ ide o vaše edition, som aktualizoval svoju odpoveď s možným riešením. Prosím, mohli by ste to skúsiť?
jccampanero

Fungovalo to, omg, vďaka tony!!!
Meggan Sam

V iných jazykoch

Táto stránka je v iných jazykoch

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