维基百科第一段

时间:2011-11-27 15:51:50

标签: java parsing web-scraping jsoup wikipedia

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

非常感谢。

3 个答案:

答案 0 :(得分:8)

这非常简单,每个半结构化页面的过程都非常相似。

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

使用文章 Potato 作为示例,您会发现您感兴趣的<p> aragraph位于以下中:

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

换句话说,您希望找到<p>内的第一个div元素,其中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 [...]."
  }
}

答案 1 :(得分:2)

看起来第一段也是文档中的第一个<p>块。所以这可能有用:

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

现在您可以获取此元素的内容

答案 2 :(得分:1)

席尔瓦提出的解决方案适用于大多数情况,例如“JavaScript”和“United States”。段落应选择为doc.select(“。mw-body-content p”);

检查this GitHub 代码以获取更多详细信息。您还可以从HTML中删除一些元数据信息以提高准确性。