【问题标题】:Wikipedia first paragraph维基百科第一段
【发布时间】:2011-11-27 15:51:50
【问题描述】:

我正在编写一些 Java 代码,以便使用 Wikipedia 在文本上实现 NLP 任务。如何使用 JSoup 提取维基百科文章的第一段?

非常感谢。

【问题讨论】:

    标签: java parsing web-scraping jsoup wikipedia


    【解决方案1】:

    这非常简单,对于您从中提取信息的每个半结构化页面,该过程都非常相似。

    首先,您必须唯一标识所需信息所在的 DOM 元素。最简单的方法是使用 Web 开发工具,例如 Firefox 中的 Firebug,或者与 IE(我认为 > 6)和 Chrome 捆绑在一起的那些。

    以文章Potato为例,你会发现你感兴趣的<p>aragraph在以下block中:

    <div class="mw-content-ltr" lang="en" dir="ltr">
      <div class="metadata topicon" id="protected-icon" style="display: none; right: 55px;">[...]</div>
      <div class="dablink">[...]</div>
      <div class="dablink">[...]</div>
      <div>[...]</div>
      <p>The potato [...]</p>
      <p>[...]</p>
      <p>[...]</p>
    

    换句话说,您希望找到位于div 内的第一个&lt;p&gt; 元素,其中class 称为mw-content-ltr

    然后,您只需要使用 jsoup 选择该元素,例如使用其选择器语法(与 jQuery 非常相似):

    public class WikipediaParser {
      private final String baseUrl; 
    
      public WikipediaParser(String lang) {
        this.baseUrl = String.format("http://%s.wikipedia.org/wiki/", lang);
      }
    
      public String fetchFirstParagraph(String article) throws IOException {
        String url = baseUrl + article;
        Document doc = Jsoup.connect(url).get();
        Elements paragraphs = doc.select(".mw-content-ltr p");
    
        Element firstParagraph = paragraphs.first();
        return firstParagraph.text();
      }
    
      public static void main(String[] args) throws IOException {
        WikipediaParser parser = new WikipediaParser("en");
        String firstParagraph = parser.fetchFirstParagraph("Potato");
        System.out.println(firstParagraph); // prints "The potato is a starchy [...]."
      }
    }
    

    【讨论】:

    • 再次您好,非常感谢您。建议的解决方案效果很好。
    【解决方案2】:

    似乎第一段也是文档中的第一个 &lt;p&gt; 块。所以这可能有效:

    Document doc = Jsoup.connect("http://en.wikipedia.org/wiki/B-tree").get();
    Elements paragraphs = doc.select("p");
    Element firstParagraph = paragraphs.first();
    

    现在你可以得到这个元素的内容了

    【讨论】:

    • getElementsByClass() 按类名返回元素,而不是按标签名。
    【解决方案3】:

    Silva 提出的解决方案适用于大多数情况,但“JavaScript”和“United States”除外。段落应该选择为 doc.select(".mw-body-content p");

    查看this GitHub code 了解更多详情。您还可以从 HTML 中删除一些元数据信息以提高准确性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 2010-12-06
      • 2019-05-24
      • 1970-01-01
      • 2016-08-16
      相关资源
      最近更新 更多