2009-10-14 8 views
10

私はWikipedia-Articleを取得しました。記事から最初のz行(または最初のx文字、または最初のy単語)を取り出したいとします。ウィキペディアの最初の行を取得する記事

問題:ソースWiki-Text(API経由)または解析済みHTML(直接的なHTTP-Request経由、最終的には印刷版)を取得できますが、最初の行はどのように表示されますか?通常、ソース(htmlとwikitextの両方)は情報ボックスと画像で始まり、最初に表示される実際のテキストはコードのどこかに表示されます。

たとえば、 Albert Einstein on Wikipedia(印刷版)です。最初の実テキストライン"Albert Einstein(ドイツ語:[albɐtaɪ̯nʃtaɪ̯n]; 1879年4月18日 - 1955年4月14日)は理論的な物理学者でした。は開始されていません。同じことがWiki-Sourceにも適用されます。同じ情報ボックスで始まるなどです。

このタスクをどのように達成しますか?プログラミング言語はJavaですが、これは問題ではありません。

私の頭に浮かんだ解決策は、xpathクエリを使用することでしたが、このクエリはすべての境界ケースを処理するにはかなり複雑です。 [更新]それほど複雑ではありませんでした。下記の私の解決策をご覧ください。[/更新]

ありがとう!

+0

「我々は、代わりに情報データベースを投入するのは、システムがまさにそのようなウィキペディアなどの公共百科事典のデータベースからコンテンツを取得することを考えた」 - http://www.fryan0911.com/2009 /05/how-to-retrieve-content-from-wikipedia.html –

+1

KMan:記事のWikiソースを取得するだけです。 OPによって述べられた問題は依然として適用されます。 – Joey

答えて

0
、私は以下のソリューション働い

してみてください:それは短いので(私が印刷版を取ったXHTML-ソースコード上のXPathクエリを使用して をするだけでなく、それ通常のバージョンで動作します)。

//html/body//div[@id='bodyContent']/p[1] 

これはドイツ語と英語のWikipediaで動作し、最初の段落を出力しない記事は見つかりませんでした。 解決策もかなり速く、私はxhtmlの最初のx文字だけを取ることも考えましたが、これはxhtmlを無効にします。

誰かがJAVA-コードを探している場合は、ここでは次のようになります。

private static DocumentBuilderFactory dbf; 
static { 
    dbf = DocumentBuilderFactory.newInstance(); 
    dbf.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
} 
private static XPathFactory xpathf = XPathFactory.newInstance(); 
private static String xexpr = "//html/body//div[@id='bodyContent']/p[1]"; 


private static String getPlainSummary(String url) { 
    try { 
     // OPen Wikipage 
     URL u = new URL(url); 
     URLConnection uc = u.openConnection(); 
     uc.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1) Gecko/20090616 Firefox/3.5"); 
     InputStream uio = uc.getInputStream(); 
     InputSource src = new InputSource(uio); 

     //Construct Builder 
     DocumentBuilder builder = dbf.newDocumentBuilder(); 
     Document docXML = builder.parse(src); 

     //Apply XPath 
     XPath xpath = xpathf.newXPath(); 
     XPathExpression xpathe = xpath.compile(xexpr); 
     String s = xpathe.evaluate(docXML); 

     //Return Attribute 
     if (s.length() == 0) { 
      return null; 
     } else { 
      return s; 
     } 
    } 
    catch (IOException ioe) { 
     logger.error("Cant get XML", ioe); 
     return null; 
    } 
    catch (ParserConfigurationException pce) { 
     logger.error("Cant get DocumentBuilder", pce); 
     return null; 
    } 
    catch (SAXException se) { 
     logger.error("Cant parse XML", se); 
     return null; 
    } 
    catch (XPathExpressionException xpee) { 
     logger.error("Cant parse XPATH", xpee); 
     return null; 
    } 
} 

は、あなたがする必要はありませんgetPlainSummary("http://de.wikipedia.org/wiki/Uma_Thurman");

0

さて、Wikiソースを使用している場合、最初はすべてのテンプレートを削除することができます。これは、infoboxesまたはいくつかのメッセージが上部にあるほとんどの記事で十分に機能します。

しかし、一部の記事では、開始用の吹き出しをテンプレート自体に入れて、そこでは少し難しいかもしれません。

もう1つの方法は、記事のテキストに直接表示される最初の<p>タグの内容を取り込むことです(テーブルなどに入れ子にしないでください)。これは、おそらく(私は確かではない)<table>または<div>であるので、開始時にinfoboxesなどのものを取り除く必要があります。

一般的に、Wikipediaは人間の消費のために書かれており、意味のあるものはほとんどサポートされていません。そうすれば、記事の特定の情報を自動的に抽出するのがかなり苦しいものになります。

1

ウィキペディアのマークアップを読むことができるパーサーが必要です。試してくださいWikiTextまたは付属のパーサーXWiki

これで、不要なもの(見出し、表)は無視できます。

0

期待どおり、ソース、コンパイル済みのHTML、またはその両方を解析する必要が生じるでしょう。しかし、Wikipedia:Lead_sectionは、よく書かれた記事で何を期待するかを示しているかもしれません。

3

私も同じ必要性があり、それを行うためにいくつかのPythonコードを書いていました。

スクリプトは、指定された名前のwikipedia記事をダウンロードし、BeautifulSoupを使用してそれを解析し、最初のいくつかの段落を返します。

コードはhttp://github.com/anandology/sandbox/blob/master/wikisnip/wikisnip.pyです。

+0

すばらしい実用的な解決策ですが、この解決策はwikiマークアップがHTMLにどのように変換されるかに依存します。可能であれば、wikiマークアップを直接解析することをお勧めします。 – gnud

+0

私は試しました。しかし、マークアップには '{{...}} 'という形式の関数呼び出しが含まれているため、非常に困難でした。例えば、{{convert | 1.2 | km | mi | spell = us}} 'のようになります。 私の試みは次のとおりです:http://github.com/anandology/sandbox/blob/master/wikipedia/wikitext.py –

1

FirefoxでAlbert Einsteinの記事を開き、View sourceをクリックしました。 HTMLパーサーを使って解析するのは簡単です。あなたは<p>に焦点を当てて、その中から他のhtmlを取り除く必要があります。

2

ウィキペディアは、抄録downloadを提供しています。これは非常に大きなファイル(現在は2.5GB)ですが、すべての記事に対して必要な情報を正確に提供します。あなたは、文字列 に結果を持っている場合は、テキストを見つけるだろう例えば

1

<div id="bodyContent"> 

とそのインデックス後にあなたが最初

の指標となり
<p> 

を見つけるだろうあなたが言及した最初の段落。

このURL Link to the content (just works in the browser)

+0

答えをいただきありがとうございます。これは上記の私の解決策につながりました(bodyContent- div。 – theomega

8

を呼び出すことによって、それを使用しています。

APIのexintroパラメータは、記事の最初の(0番目の)セクションのみを返します。

例:api.php?action=query&prop=extracts&exintro&explaintext&titles=Albert%20Einstein

があまりにも、他のパラメータがあります。文字で抽出物の

  • exchars 長さ。
  • exsentences 返される文の数。
  • exintro ゼロセクションのみを返します。
  • exsectionformat 平文を抽出するために使用するどのようなセクションの見出し形式:抽出物の

    wiki — e.g., == Wikitext == 
    plain — no special decoration 
    raw — this extension's internal representation 
    
  • exlimit 最大数を返すように。抜粋生成は遅くなる可能性があるため、イントロのみの抽出の場合は20、ページ全体の抽出の場合は1に上限が設定されます。
  • explaintext 平文の抽出を返します。
  • excontinue さらに多くの結果が得られたら、このパラメータを使用して続行します。

出典:https://www.mediawiki.org/wiki/Extension:MobileFrontend#prop.3Dextracts

関連する問題