Википедия первый абзац - PullRequest
       30

Википедия первый абзац

4 голосов
/ 27 ноября 2011

Я пишу некоторый Java-код для реализации задач НЛП над текстами с использованием Википедии. Как я могу использовать JSoup для извлечения первого абзаца статьи в Википедии?

Большое спасибо.

Ответы [ 3 ]

8 голосов
/ 27 ноября 2011

Это очень просто, и процесс очень похож на каждую полуструктурированную страницу, с которой вы извлекаете информацию.

Во-первых, вы должны однозначно идентифицировать элемент DOM , гдеНеобходимая информация лежит в этом. Самый простой способ сделать это - использовать инструмент веб-разработки, такой как Firebug в Firefox, или те, которые поставляются в комплекте с IE (> 6, я думаю) и Chrome.

Используя в качестве примера статью Картофель , вы обнаружите, что интересующий вас араграф <p> находится в следующем блоке :

<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 [...]."
  }
}
2 голосов
/ 27 ноября 2011

Похоже, что первый абзац также является первым <p> блоком в документе. Так что это может сработать:

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

Теперь вы можете получить содержимое этого элемента

1 голос
/ 14 июля 2016

Решение, предложенное Silva, работает в большинстве случаев, за исключением случаев, когда " JavaScript " и " United States ". Абзацы должны быть выбраны как doc.select (". Mw-body-content p");

Проверьте этот код GitHub для более подробной информации. Вы также можете удалить некоторую информацию метаданных из HTML для повышения точности.

...