java - 使用 Jsoup 获取维基百科文章的第一段

标签 java android jquery jsoup wikipedia

我正在尝试使用以下代码获取维基百科文章的第一段:

public String getText(){
    try{
        Document doc = Jsoup.connect("https://en.wikipedia.org/wiki/Israel").get();
        Elements paragraphs = doc.select("p");
        Element firstParagraph = paragraphs.first();
        return firstParagraph.text();
    }
    catch (IOException e){return "Failed";}
}

这是我在 StackOverflow 上的线程中找到的所有方法中最简单的方法。

我不明白第一段,我只得到这一部分: The part I get from jsoup

但我想得到这部分:first paragraph on Wikipedia

如何正确使用它?
我正在寻找一个通用的解决方案...... 谢谢。

最佳答案

这实际上取决于页面的内容。
例如,您给出了一篇维基百科文章,并发现第一段(即 - 带有 <p> tag )是国家/地区的坐标,而不是有关该国家/地区的实际第一段。
这是由于描述国家的维基百科模板。

有很多模板 - 适用于国家、公司、个人等。
每个主题都是具有不同大纲的特定模板,因此很难为您提供帮助并为您提供有助于您 future 场景的一般答案。

通过具体引用您的问题,您可以排除坐标并获得页面上真正的第一段。
您的代码应该是:

public String getText(){
    try{
        Document doc = Jsoup.connect("https://en.wikipedia.org/wiki/Israel").get();
        Elements paragraphs = doc.select("p:not(:has(#coordinates))");
        Element firstParagraph = paragraphs.first();
        return firstParagraph.text();
    }
    catch (IOException e) {
        return "Failed";
    }
}

通过查看源代码,您可以注意到坐标出现在 <p> tag 中。 (这就是为什么你首先得到这个结果)并且在该标签内,还有另一个 <span> tag id 名称为“坐标”。由于您想从结果中删除坐标,您可以使用 jsoup pseudo selectors 仅获取所需内容。

<小时/>

由于这类问题很难笼统地回答,基于上面列出的原因,我想补充一些进一步使用的技巧:

  1. 建议仔细查看源代码 您正在处理的页面并检查所有标签。这样你就是 能够找到一些可能的问题(就像这个问题中出现的问题),并在编写代码时考虑这些因素 提取页面中需要的部分。
  2. 执行 CSS Query 后检查元素列表在jsoup 。您可以通过代码或通过检查 try-jsoup site 上的查询来完成此操作。 。您可以输入your query并查看元素列表。这样你可能会意识到结果不是你所期望的。有时它不会像本例中那样容易,您可能会使用元素列表来更改代码(例如,在代码中使用 Element firstParagraph = paragraphs.get(1); 而不是使用 Element firstParagraph = paragraphs.first(); )。然后您可以测试your newly improved CSS Query 看看这是否适合您。
  3. 熟悉不同的选择器很有帮助 jsoup必须提供。
    这将使您的工作更加轻松。

希望有帮助!

关于java - 使用 Jsoup 获取维基百科文章的第一段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43021074/

相关文章:

java - Micronaut 中用于 RESTful API 的响应式(Reactive)方法/类型

java - 我在 android 项目中包含的列表 fragment 似乎没有在运行时调用

jquery - 删除所有空 p 的 <p></p> 后检查 div.html() 长度

jquery - 带有 CSS 和 jQuery 的动画信封

android - 如何为每个应用程序使用一个 HttpClient?

javascript - 获取 ng-repeat 重复输入元素的值

java - 创建类的对象,而不是通过构造函数

java - firebase实时数据库验证规则

java - 使用过滤器共享登录主题

android - selenium Android 驱动程序-我可以同时运行 2 个测试吗