JSoup nie może dostać linki z html

0

Pytanie

Staram się, aby linki z kodu html strony, ale nie mogę zrobić to za pomocą Jsoup.

HTML to:

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

Jest to kod dla systemu Android, który napisałem, który, jak się wydaje, nie działa:

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

Może ktoś proszę mi pomóc z tym? Dziękuję

Edit: W zasadzie staram się zdobyć te 6 linków i dodać je do listy, aby go użyć w aplikacji.

Zmiana 2:

Więc znalazłem inny kod HTML, który może wydawać się lepiej:

<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

Najlepsza odpowiedź

2

Jak widać, w tym li określenie, w które można włączyć załącznika div:

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

Powoduje to, że zawartość zmiennej, fragment kodu HTML z klasą anime_muti_linkaby wyglądać jak:

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

Podobny wynik otrzymano, nawet jeśli zaprowadzisz porządek w swoim HTML. Użyłem tego kodu z jednego z moich poprzednich odpowiedzi:

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 dlatego można znaleźć tylko trzy kotwice.

Proszę, spróbuj naprawić swój kod HTML lub zamiast tego wybierz znacznik zakotwiczenia jako poziomu dokumentu:

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

Jeśli otrzymany wynik zawiera niechciane linki, ewentualnie możesz spróbować zawęzić używany wybierak, coś takiego:

document.select(".anime_muti_link a")

Jeśli to nie zadziała, inną możliwą alternatywą może być wybór elementów powiązania z pomocą data-video atrybut, 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));

Z pomocą nowego testowego przykład można uzyskać żądane informacje za pomocą bardzo podobnego kodu:

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

Najważniejszą częścią jest określenie wielofunkcyjnego, który powinien być zastosowany do анализируемому dokumentu, div.heading-servers ul.servers li.server w naszym przypadku.

Mam pod wybierak z wieloma fragmentami, ale w zależności od rzeczywistego wykorzystania HTML można byłoby uprościć za pomocą ul.servers li.server lub nawet li.server.

2021-12-01 22:21:33

Nie mogę zmienić języka HTML, ponieważ to nie jest moja strona. Spróbuję drugie rozwiązanie, dzięki!
Meggan Sam

Witamy @MegganSam, mam nadzieję, że to pomoże. Zaktualizowałem odpowiedzi, aby zapewnić informacje zwrotne o tym, jak może zawęzić wybór w przypadku, jeśli masz niechciane linki. Nie testowałem jeszcze to ostatnia aktualizacja. Mam nadzieję, że to pomoże.
jccampanero

@MegganSam czy jesteś w Stanie przetestować proponowane rozwiązanie? Czy się udało?
jccampanero

Tak, próbowałem. Niestety, to nie działa :(
Meggan Sam

Przykro mi to słyszeć. Przypuszczam, że jest to związane z traktowaniem całego dokumentu HTML. Zaktualizowałem odpowiedzi, starając się zaproponować inną alternatywę. Proszę, czy mógłby pan spróbować? Mam nadzieję, że to pomoże.
jccampanero

Dzięki za próbę pomocy, ale wygląda na to, sam HTML jest napisany bardzo dobrze, więc jestem edytowany przez swoje pytanie innym, w którym też jest potomne klasy, więc może pomożesz mi z tym? Próbowałem twoja decyzja na nowym, ale ja też niestety nie działa
Meggan Sam

Proszę. Tak, zgadzam się z tobą, Мегган, prawdopodobnie w HTML musi być coś nie tak. Co do twojej wersji, zaktualizowałem swoją odpowiedź możliwym rozwiązaniem. Proszę, czy mógłby pan spróbować?
jccampanero

Udało się, boże, dziękuję bardzo!!!
Meggan Sam

W innych językach

Ta strona jest w innych językach

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