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>

นี่คือ android รหัสที่ฉันเขียนซึ่งไม่เหมือนจะทำงาน:

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

ถ้าได้รับผลลัพธ์บรรจุ undesired ที่อยู่เชื่อมโยงบางทีคุณสามารถลองแคปรับเทียบข้อมูลอัตโนมัติใช้บางอย่างเหมือน:

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 อาจจะเป็นกับประยุกต์@item text character set ul.servers li.server หรือแม้แต่ li.server.

2021-12-01 22:21:33

ฉันไม่สามารถเปลี่ย HTML เท่านั้นไม่ใช่ต์บนเว็บไซต์ของฉัน. ฉันจะพยายามของคุณอีกทางออกขอบคุณ!
Meggan Sam

คุณยินดีต้อนรั@MegganSam ฉันหวังว่ามันช่วยได้ ฉันปรับคำตอบเพื่อให้การแจ้งเตือนการเริ่มทำงานเกี่ยวกับวิธีการอาจจะจำกัดครับเทียบข้อมูลอัตโนมัติในกรณีที่คุณเอา undesired ที่อยู่เชื่อมโยง. ฉันยังไม่ได้ทดสอบเรื่องนี้เมื่อปรับปรุง ฉันหวังว่ามันช่วยได้
jccampanero

@MegganSam คุณสามารถจะทดสอบที่ขอเธอแต่งงานทางออก? เน"เธ"เน‰เธ œ เธฅเน"เธซเธ?
jccampanero

ฉันพยายามค่ะ โชคร้ายที่มันไม่ทำงาน:(
Meggan Sam

ฉันขอโทษนะที่ได้ยินอย่างนั้น ฉันคิดว่ามันต้องมีส่วนเกี่ยวข้องกับการประมวลผลทั้งเอกสารแบบ HTML ฉันปรับคำตอบที่พยายามในกรณีที่อีกทางเลือก ได้โปรดคุณน่าจะลอง? ฉันหวังว่ามันช่วยได้
jccampanero

ขอบคุณสำหรับพยายามจะช่วยแต่ดูเหมือ HTML งตัวเองไม่ได้เขียนดีดังนั้นฉันได้แก้ไขของฉันคำถามกับอีกหนึ่งมันมีเด็กเรียนด้วยดังนั้นคุณอาจจะช่วยฉันกับมันเหรอ? ฉันพยายามคุณแก้ปัญหาอยู่ที่ใหม่หนึ่งแต่มันไม่ได้ผลเหมือนกันเรื่องน่าเศร้า
Meggan Sam

คุณยินดีต้อนรับ ใช่ฉันเห็นด้วยกับคุณ Meggan อาจจะมันน่าจะมีอะไรผิดปกติในเอกสาร HTML. เกี่ยวกับของคุณฉบับพิมพ์ฉันปรับคำตอบของฉันกับจะเป็นไปได้ทางออกหรอกนะ ได้โปรดคุณน่าจะลอง?
jccampanero

มันได้ผล omg,ขอบคุณข้อมูล!!!
Meggan Sam

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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