Checkbox, radio buttons e não é capaz de obter links de html

0

Pergunta

Eu estou tentando obter links de html de um site, mas não é possível fazer isso usando um checkbox, radio buttons.

Este é o 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 é o android código que eu escrevi que não parecem 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();
            }

Alguém por favor pode me ajudar com isso? Obrigado

Edit: Basicamente, eu estou tentando pegar os 6 links e adicionar a minha lista de usá-lo dentro do app.

Edit 2:

Então, eu encontrei outra HTML que pode parecer melhor:

<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

Melhor resposta

2

Como você pode ver, neste li definição você está incluindo um aninhados div:

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

É esta a causa de que o conteúdo da variável, o fragmento de HTML com classe anime_muti_linkpara se parecer com:

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

Um resultado semelhante vai ser obtidos mesmo se você arrumar seu HTML. Eu usei este código a partir de uma de minhas respostas anteriores:

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 é por isso que você está encontrando apenas três âncoras.

Por favor, tente corrigir o seu HTML ou seleccionando a marca de âncora como a nível do documento em vez disso:

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 o resultado obtido contém links indesejados, talvez você pode tentar reduzir o seletor usado, algo como:

document.select(".anime_muti_link a")

Se isso não funcionar, outra possível alternativa poderia ser de selecionar os elementos de âncora com um 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));

Com seu novo caso de teste, você pode obter a informação desejada com um 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));

A parte mais importante é a definição do selector de que deve ser aplicada ao documento analisado, div.heading-servers ul.servers li.server no nosso caso.

Eu, desde um seletor com muitos fragmentos, mas, dependendo do uso real HTML, ele pode ser simplificado com ul.servers li.server ou até li.server.

2021-12-01 22:21:33

Eu não posso mudar o HTML como esse não é o meu site. Eu vou tentar a sua outra solução, obrigado!
Meggan Sam

Você é bem-vindo @MegganSam, espero que ajude. Eu atualizei a resposta para fornecer comentários sobre como, possivelmente, restringir o seletor no caso de você obter indesejada links. Eu ainda não testou esta última atualização. Espero que ajude.
jccampanero

@MegganSam você foi capaz de testar a solução proposta? Funcionou?
jccampanero

Eu tentei, sim. Infelizmente, isso não funciona :(
Meggan Sam

Eu lamento ouvir isso. Acho que tem a ver com o processamento de todo o documento HTML. Eu atualizei a resposta tentando oferecer uma outra alternativa. Por favor, você poderia tentar? Espero que ajude.
jccampanero

Obrigado por tentar ajudar, mas parece que o HTML não é escrito bem assim que eu tenha editado a minha pergunta com outra que tem filho classes também, então talvez você pode me ajudar com isso? Eu tentei você uma solução nova, mas que não quer trabalhar, infelizmente,
Meggan Sam

Você é bem-vindo. Sim, eu concordo com você Meggan, provavelmente deve haver algo de errado no HTML. A respeito de sua edição, eu atualizei a minha resposta com uma possível solução. Por favor, você poderia tentar?
jccampanero

Funcionou, omg, obrigado!!!
Meggan Sam

Em outros idiomas

Esta página está em outros idiomas

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