JSoup html'den bağlantı alamıyor

0

Soru

Bir sitenin html'sinden bağlantılar almaya çalışıyorum ancak bunu Jsoup kullanarak yapamıyorum.

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

Bu, yazdığım ve işe yaramayan android kodudur:

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

Biri bana yardım edebilir mi lütfen? Teşekkürler

Düzenleme: Temel olarak bu 6 bağlantıyı almaya ve bunları uygulama içinde kullanmak için listeme eklemeye çalışıyorum.

Düzenleme 2:

Bu yüzden daha iyi görünebilecek başka bir HTML buldum:

<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

En iyi cevabı

2

Gördüğünüz gibi, bu li iç içe geçmiş bir tanım dahil ediyorsunuz div:

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

Bu, değişken içeriğinin, sınıfla HTML parçasının anime_muti_link gibi bakmak için :

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

HTML'NİZİ düzenleseniz bile benzer bir sonuç elde edilir. Bu kodu önceki cevaplarımdan birinden kullandım:

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

İşte bu yüzden sadece üç çapa buluyorsunuz.

Lütfen html'nizi düzeltmeyi veya belge düzeyi olarak bağlantı etiketini seçmeyi deneyin:

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

Elde edilen sonuç istenmeyen bağlantılar içeriyorsa, belki de kullanılan seçiciyi daraltmayı deneyebilirsiniz, örneğin:

document.select(".anime_muti_link a")

Bu işe yaramazsa, başka bir olası alternatif, bağlantı elemanlarını bir data-video nitelik, 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));

Yeni test durumunuzla, istediğiniz bilgileri çok benzer bir kodla elde edebilirsiniz:

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

En önemli kısım, ayrıştırılan belgeye uygulanması gereken seçicinin tanımıdır, div.heading-servers ul.servers li.server bizim durumumuzda.

Birçok parçaya sahip bir seçici sağladım, ancak gerçek kullanım HTML'SİNE bağlı olarak basitleştirilebilir ul.servers li.server hatta li.server.

2021-12-01 22:21:33

Bu benim web sitem olmadığı için HTML'yi değiştiremiyorum. Diğer çözümünü deneyeceğim, teşekkürler!
Meggan Sam

Hoşgeldin @ MegganSam, umarım yardımcı olur. İstenmeyen bağlantılar elde etmeniz durumunda seçicinin nasıl daraltılacağı hakkında geri bildirim sağlamak için cevabı güncelledim. Bu son güncellemeyi test etmedim. Yardımcı olur umarım.
jccampanero

@MegganSam Önerilen çözümü test edebildiniz mi? İşe yaradı mı?
jccampanero

Ben yaptım deneyin, Evet. Ne yazık ki, işe yaramıyor :(
Meggan Sam

Ben özür duyuyor. Sanırım bunun tüm HTML belgesini işlemekle ilgisi var. Başka bir alternatif sunmaya çalışırken cevabı güncelledim. Lütfen, deneyebilir misin? Yardımcı olur umarım.
jccampanero

Teşekkürler yardım için çalışıyor ama görünüşe göre HTML kendisi değil ama iyi yazmışsın o yüzden ben düzenlenmiş benim sorum ile bir tane var alt sınıflar da böylece belki yardım bana? Sana yeni bir çözüm denedim ama bu da ne yazık ki işe yaramıyor
Meggan Sam

Rica ederim. Evet, sana katılıyorum Meggan, muhtemelen html'de bir sorun olmalı. Baskınızla ilgili olarak, cevabımı olası bir çözümle güncelledim. Lütfen, deneyebilir misin?
jccampanero

İşe yaradı, omg, çok teşekkürler!!!
Meggan Sam

Diğer dillerde

Bu sayfa diğer dillerde

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