JSoup no es capaz de conseguir enlaces de html

0

Pregunta

Estoy tratando de conseguir enlaces de html de un sitio, pero no puede hacerlo utilizando Jsoup.

Este es el 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>

Este es el código android que escribí que no parece funcionar:

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

Por favor alguien puede ayudarme con esto? Gracias

Edit: Básicamente estoy tratando de conseguir los 6 enlaces y agregarlos a mi lista para el uso dentro de la aplicación.

Edit 2:

Así que me encontré con otro HTML a la que parece mejor:

<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

Mejor respuesta

2

Como se puede ver, en este li la definición incluye un anidados div:

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

Esta es la causa de que el contenido de la variable, el fragmento de HTML con clase anime_muti_link, para quedar como:

<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 resultado similar se obtiene incluso si eres ordenado del código HTML. He utilizado este código en uno de mis anteriores respuestas:

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

Y esta es la razón por la que están encontrando sólo tres puntos de anclaje.

Por favor, trate de corregir el HTML o la selección de la etiqueta de anclaje como el nivel de documento en su lugar:

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 el resultado obtenido contiene enlaces no deseados, tal vez usted puede probar el estrechamiento del selector de usa, algo así como:

document.select(".anime_muti_link a")

Si esto no funciona, otra posible alternativa podría ser la selección de los elementos de anclaje con un data-video atributo, 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 su nuevo caso de prueba, se puede obtener la información deseada con un código 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));

La parte más importante es la definición del selector que se deben aplicar en el documento analizado, div.heading-servers ul.servers li.server en nuestro caso.

He provisto de un selector con muchos fragmentos, pero dependiendo del uso real de HTML podría ser simplificado con ul.servers li.server o incluso li.server.

2021-12-01 22:21:33

Yo no puedo cambiar el HTML, ya que no es mi sitio web. Voy a probar tu otra solución, gracias!
Meggan Sam

Usted es bienvenido @MegganSam, espero te sirva de ayuda. He actualizado la respuesta a proporcionar retroalimentación acerca de cómo posiblemente estrecho el selector en caso de obtener enlaces no deseados. Yo no he probado esta última actualización. Espero te sirva de ayuda.
jccampanero

@MegganSam Fueron capaces de poner a prueba la solución propuesta? Hizo el trabajo?
jccampanero

Traté de hacerlo, sí. Por desgracia, no funciona :(
Meggan Sam

Siento mucho oír eso. Supongo que tiene que ver con el procesamiento de todo el documento HTML. He actualizado la respuesta tratando de ofrecer otra alternativa. Por favor, podría usted probar? Espero te sirva de ayuda.
jccampanero

Gracias por intentar ayudar, pero parece que el propio HTML no está escrito así, así que he editado mi pregunta con otra que tiene el niño de las clases, para que así tal vez puede que me ayude con eso? He probado la solución en el nuevo uno, pero que no funciona bien, lamentablemente
Meggan Sam

Son bienvenidos. Sí, estoy de acuerdo con usted Meggan, probablemente debe haber algo mal en el código HTML. Con respecto a su edición, he actualizado mi respuesta con una posible solución. Por favor, podría usted probar?
jccampanero

Funcionó, omg, un millón de gracias!!!
Meggan Sam

En otros idiomas

Esta página está en otros idiomas

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