JSoup不能获得的链接html

0

的问题

我试图获得的链接html网站而无法做到使用Jsoup.

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

这是码我写这似乎并不工作:

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

有人可以帮我这个? 感谢

编辑:基本上,我试图让那些6链接,并把它们添加到名单的使用,它的应用程序内。

编辑2:

所以我发现了另一个HTML,似乎可以更好:

<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

最好的答案

2

正如你可以看到,在这个 li 定义是包括一套 div:

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

这是造成这一变量内容,HTML段,与类 anime_muti_link,是这样的:

<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。 我用这个代码,从我 先前的答案:

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

这就是为什么你们找到只有三个锚。

请你纠正你HTML或选择锚标签作为该文件的水平,而不是:

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

如果结果得到的含有不需要的链接,也许你可以尝试缩小选择使用的,是这样的:

document.select(".anime_muti_link a")

如果这不起作用,另一种可能的替代可选择的锚元素 data-video 属性, 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));

你的新试验情况下,可以获得所需的信息的一个非常类似的代码:

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

最重要的部分是定义的 选择 ,应该应用于分析的文件, div.heading-servers ul.servers li.server 在我们的情况。

我提供一种选择的许多碎片,但是这取决于实际使用HTML它可以简化与 ul.servers li.server 甚至 li.server.

2021-12-01 22:21:33

我不能改变HTML为那不是我的网站。 我会试试你的其他解决方案,谢谢!
Meggan Sam

欢迎你@MegganSam,我希望这有所帮助。 我的答案提供反馈,关于如何可能缩小选择的情况下,你不期望获得的链接。 我没有测试过这最后的更新。 我希望这有所帮助。
jccampanero

@MegganSam是你能试验所提出的解决方案? 没有工作?
jccampanero

我没有尝试,是的。 不幸的是,它不工作:(
Meggan Sam

我很抱歉听到这个消息。 我想它已经做的与处理整个HTML文档。 我更新答案试图提供另一种替代方案。 拜托,你能试试吗? 我希望这有所帮助。
jccampanero

谢谢你试图帮助,但似乎是HTML本身并不是写得好,所以我编辑我的问题与另外一个有孩子类太多,所以可以你也许帮助我吗? 我试了你的解决方案上的新的一个,但这并不起作用,可悲的是
Meggan Sam

你是受欢迎的。 是的,我同意你的Meggan,也许应该有的东西是错误的,在HTML。 关于你的版本,我更新我的答案有一个可能的解决方案。 拜托,你能试试吗?
jccampanero

它的工作,妈呀,由于一吨!!!
Meggan Sam

其他语言

此页面有其他语言版本

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