【问题标题】:How to get text from nested span using Jsoup?如何使用 Jsoup 从嵌套跨度中获取文本?
【发布时间】:2018-04-10 05:04:05
【问题描述】:

我正在尝试获取跨度中的文本

使用下面的代码。然而,输出的行为就好像嵌套跨度不存在

            Elements tags = document.select("div[id=tags]"); 

            for (Element tag:tags){


                Elements child_tags = tag.getElementsByTag("class");  

                String key = tag.html();
                System.out.println(key); //only as a test

                for (Element child_tag:child_tags){
                    System.out.println("\t" + child_tag.text());

                }

我的输出是

      <hr />Tags: 
      <span id="category"></span> 
      <span id="voteSelector" class="initially_hidden"> <br /> </span>      

【问题讨论】:

  • 使用这个选择器span[class=tag]而不是div[id=tags],你会得到你的结果。
  • 它不起作用。尝试在chesstempo.com/chess-problems/15 中提取标签“Hanging Piece”、“Unsound Sacrifice”,这正是我正在解决的问题。
  • 请复制相关的html sn-p并将其粘贴为文本而不是图像链接。

标签: java html jsoup


【解决方案1】:

假设您正在尝试https://chesstempo.com/chess-problems/15 上的代码,并且您想要的数据显示在下图 中

现在,使用 Jsoup,您将获得在浏览器中呈现为源代码的数据,为了确认,您可以在浏览器中按 CTRL+U,这将打开一个新窗口,其中 Jsoup 将获得的实际内容将是显示。现在回答您的问题,浏览器源代码中不存在您尝试检索的部分,请按CTRL+U。

如果内容是使用 JAVASCRIPT 呈现的,那么 JSOUP 将看不到这些内容,因此您必须使用其他东西来运行 javascript 并为您提供详细信息。

JSoup 不运行 Javascript,也不是浏览器。

编辑

使用 SELENIUM 有一个好转。以下是获取 url 的确切源代码和您正在寻找的所需数据的工作代码:

import java.io.IOException;
import java.io.PrintWriter;

import org.json.simple.parser.ParseException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class JsoupDummy {
 public static void main(String[] args) throws IOException, ParseException {
    System.setProperty("webdriver.gecko.driver", "D:\\thirdPartyApis\\geckodriver-v0.19.1-win32\\geckodriver.exe");
    WebDriver driver = new FirefoxDriver();

    try {
        driver.get("https://chesstempo.com/chess-problems/15");
        Document doc = Jsoup.parse(driver.getPageSource());
        Elements elements = doc.select("span.ct-active-tag");
        for (Element element:elements){
             System.out.println(element.html());
        }

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        /*write.flush();
        write.close();*/
        driver.quit();

    }
}
}

您需要 selenium 网络驱动程序Selenium Web Driver,它可以模拟浏览器行为并允许您渲染脚本编写的 html 内容。

【讨论】:

  • 你知道我可以用什么来获取标签吗?我使用了随机工作的包 HtmlUnit。有时我可以检索标签,有时我不能...
  • 你太棒了!有效!我认为带有 select 和 .html() 的查询对此有所帮助。
【解决方案2】:
Elements child_tags = tag.getElementsByTag("class");

通过这一行,您试图获取一个带有标签类的元素,即&lt;class&gt;...&lt;/class&gt;,它不存在。将该行更改为:

Elements child_tags = tag.getElementsByClass("tag");

通过属性值 class= tag 或 to 获取元素:

Elements child_tags = tag.getElementsByTag("span"); 

通过标签名 = span 获取元素。

【讨论】:

  • 两者都不起作用。您在发布答案之前是否对其进行了测试?尝试在chesstempo.com/chess-problems/15中提取标签“Hanging Piece”、“Unsound Sacrifice”,看看你的方法是否有效
猜你喜欢
  • 2023-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
相关资源
最近更新 更多