JSoup pas en mesure d'obtenir des liens à partir de html

0

La question

Je suis en train d'essayer d'obtenir des liens à partir de code html d'un site, mais impossible de le faire à l'aide de Jsoup.

C'est le 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>

C'est de l'android code que j'ai écrit ce qui ne semble pas fonctionner:

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

Quelqu'un peut-il m'aider avec cela? Merci

Edit: en gros je suis d'essayer d'obtenir ces 6 liens et de les ajouter à ma liste de l'utiliser dans l'application.

Edit 2:

J'ai donc trouvé un autre format HTML qui peut semble mieux:

<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

La meilleure réponse

2

Comme vous pouvez le voir, en ce li la définition que vous êtes, y compris un imbriquée div:

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

C'est la cause que le contenu des variables, le fragment HTML avec classe anime_muti_link, pour ressembler à:

<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 résultat similaire est obtenu de même si vous rangé votre code HTML. J'ai utilisé ce code à partir d'une de mes réponses précédentes:

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

Et c'est pourquoi vous les trouvez en seulement trois points d'ancrage.

S'il vous plaît, essayer de les corriger votre code HTML ou en sélectionnant la balise d'ancrage que le niveau du document à la place:

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

Si le résultat obtenu contient des liens indésirables, vous pouvez peut-être essayer un rétrécissement de l'sélecteur utilisé, quelque chose comme:

document.select(".anime_muti_link a")

Si cela ne fonctionne pas, une autre alternative pourrait être la sélection de l'ancrage des éléments avec un data-video attribut, 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));

Avec votre nouveau cas de test, vous pouvez obtenir l'information désirée avec une très similaires code:

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 partie la plus importante est la définition du sélecteur qui devrait être appliquée à l'analyse de document, div.heading-servers ul.servers li.server dans notre cas.

J'ai fourni un sélecteur avec de nombreux fragments, mais en fonction de l'utilisation réelle HTML, il pourrait être simplifié avec ul.servers li.server ou même li.server.

2021-12-01 22:21:33

Je ne peux pas modifier le code HTML que ce n'est pas mon site web. Je vais essayer votre solution, merci!
Meggan Sam

Vous êtes les bienvenus @MegganSam, j'espère que cela aide. J'ai mis à jour la réponse à fournir de la rétroaction sur la façon d'éventuellement étroit le sélecteur dans le cas où vous obtenir des liens indésirables. Je n'ai pas testé cette dernière mise à jour. J'espère que cela aide.
jccampanero

@MegganSam avez-vous Été en mesure de tester la solution proposée? Fait-il?
jccampanero

J'ai essayé, oui. Malheureusement, il ne fonctionne pas :(
Meggan Sam

Je suis désolé de l'entendre. Je suppose que cela a à faire avec le traitement de l'ensemble du document HTML. J'ai mis à jour la réponse en essayant de fournir une autre alternative. S'il vous plaît, pourriez-vous essayer? J'espère que cela aide.
jccampanero

Merci pour essayer de les aider, mais semble comme le HTML lui-même n'est pas bien écrit, donc j'ai édité ma question avec une autre qui a les classes enfant aussi, de sorte que vous pouvez peut-être m'aider? J'ai essayé de vous la solution sur la nouvelle mais que cela ne fonctionne pas malheureusement
Meggan Sam

Vous êtes les bienvenus. Oui, je suis d'accord avec vous Meggan, probablement il devrait y avoir quelque chose qui cloche dans le code HTML. Concernant votre édition, j'ai mis à jour ma réponse avec une solution possible. S'il vous plaît, pourriez-vous essayer?
jccampanero

Il a travaillé, omg, merci une tonne!!!
Meggan Sam

Dans d'autres langues

Cette page est dans d'autres langues

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