JSoup není schopen získat odkazy z html

0

Otázka

Snažím se získat odkazy z html stránek, ale nemůže tak učinit pomocí Jsoup.

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

To je android kód, který jsem napsal, který nefunguje:

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

Může mi prosím někdo pomoci s tímhle? Díky

Edit: v Podstatě se snažím dostat na těch 6 odkazy a přidat je do svého seznamu, aby jej použít v rámci aplikace.

Edit 2:

Tak jsem našel jiný HTML kód, který může zdá lepší:

<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

Nejlepší odpověď

2

Jak můžete vidět, v tomto li definice jsou včetně vnořené div:

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

To je příčinou, že obsah proměnné, HTML fragment s třídou anime_muti_link, vypadat jako:

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

Podobný výsledek bude možné získat i pokud jste tidy HTML. Použil jsem tento kód z jednoho z mých předchozích odpovědí:

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

A to je důvod, proč jste se najít pouze tři kotvy.

Prosím, zkuste oprava HTML nebo výběrem kotva tag jako úroveň dokumentu místo:

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

Pokud výsledek obsahuje nežádoucí odkazy, možná můžete zkusit zúžení volič používá, něco jako:

document.select(".anime_muti_link a")

Pokud to nefunguje, další možnou alternativou by mohl být výběr kotevní prvky s data-video atribut, 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));

S novou testovací případ, můžete získat požadované informace s velmi podobný kód:

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

Nejdůležitější částí je definice voliče , které by měly být aplikovány na analyzovanou dokumentu, div.heading-servers ul.servers li.server v našem případě.

I za předpokladu, volič s mnoha fragmenty, ale v závislosti na skutečném použití HTML by to mohlo být zjednodušena s ul.servers li.server nebo dokonce li.server.

2021-12-01 22:21:33

Nemůžu změnit HTML jako, že to není moje webové stránky. Pokusím se vám jiné řešení, díky!
Meggan Sam

Jste vítáni @MegganSam, doufám, že to pomůže. Aktualizoval jsem odpověď poskytnout zpětnou vazbu o tom, jak případně zúžit výběr v případě, že jste získat nežádoucí odkazy. Já jsem testoval tuto poslední aktualizaci. Doufám, že to pomůže.
jccampanero

@MegganSam jste Byli schopni otestovat navrhované řešení? Povedlo se to?
jccampanero

Zkusil jsem to, ano. Bohužel to nefunguje :(
Meggan Sam

Je mi líto, že to slyším. Předpokládám, že to má co dělat se zpracování celého HTML dokumentu. Aktualizoval jsem odpověď snažím poskytuje další alternativu. Prosím, mohl byste to zkusit? Doufám, že to pomůže.
jccampanero

Díky, že se snažíš pomoct, ale zdá se, jako HTML, sama o sobě není napsán dobře, takže jsem upravil mou otázku s jinou, která má dítě třídy taky, takže můžeš mi s tím pomoct? Snažil jsem se vám řešení na nové, ale to taky nefunguje bohužel
Meggan Sam

Jste vítáni. Ano, souhlasím s vámi, Meggan, asi by tam mělo být něco špatně v HTML. O vaše vydání, aktualizoval jsem svou odpověď s možným řešením. Prosím, mohl byste to zkusit?
jccampanero

To fungovalo, omg, díky moc!!!
Meggan Sam

V jiných jazycích

Tato stránka je v jiných jazycích

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