2016-08-16 7 views
0

私はいくつかの問題にHTML文書を解析しています。私はxml2を使用していますが、これまでのところ私はかなり幸せです。しかし、私が解決したい問題は依然として残っています。これは基本的に私の文書をパースする方法です:Rで正しくHTMLを解析するにはどうすればよいですか?

html.raw <- xml2::read_html('/Users/simgeh/Documents/pipeDirs/BMAS/html_withid/2014_02_17_nahles_in_paris.html')   
docContent <- xml_text(xml_find_all(html.raw, xpath="//div[@id='content']//text() 
             [not(ancestor-or-self::div[@class='docType'])] 
             [not(ancestor-or-self::h1[@class='isFirstInSlot'])] 
             [not(ancestor-or-self::div[@class='abstract'])] 
             [not(ancestor-or-self::div[@class='sectionRelated'])] 
             [not(ancestor-or-self::div[@id='contentsocial'])]")) 

ほとんどの場合、内容を取得すると(たいてい長いテキスト)OKです。しかし場合によっては、たとえば記事にリンクがいくつかある場合、それは混乱のように見えるかもしれません。解析されたテキストは、次のようになります。

アムDonnerstag(12.01。)wirdBundesaußenminister博士はフランク・ヴァルター・シュタインマイヤー イムAuswärtigenAMTのMIT青年Amtskollegen AUS GroßbritannienウントAUS Frankreich、ジャック・ストローウントフィリップ Douste-Blazy 、GemeinsameのためのEUのためのHohenの代表者 Außen-und Sicherheitspolitik、Javier Solana、Zusammenkommen。 Themore トレフェンズ・アース・イニシアティブ・ヌクル・プログラム・セイン。

しかし

は次のようになります。

アムDonnerstag(12.01。)wirdBundesaußenminister博士はフランク・ヴァルター・ シュタインマイヤーイムAuswärtigenAMTのMIT青年Amtskollegen AUS GroßbritannienウントAUS Frankreich、

ジャックストロー

および

フィリップドウSTE-Blazy

、sowie DEMホヘンRepräsentanten・デア・EUのfürGemeinsameAußen-を死ぬウント Sicherheitspolitik、

ハビエル・ソラナ

、zusammenkommen。 Thema des Treffens wird das iranische Nuklearprogramm sein。

問題は、テキストの中にいくつかの言葉が別の言語で書かれていて、それを示すことが好きだったことです。たとえば、次のように名前「ジャック・ストロー」が参照されている:

<span lang=\"en-GB\" xml:lang=\"en-GB\" xml:lang=\"en-GB\">Jack Straw</span> 

毎回これはテキストが台無しにされますが起こります。だから私は、解析されたテキストの品質を改善するいくつかの方法を探しています。

おそらく解決策が見つかりましたが、期待通りに機能しません。私のxpath文字列から//text()を削除した場合、解析されたテキストは意図した通りに見えるようになりますが、コンテナから不要なコンテンツを削除する方法はありません。短い[not(ancestor-or-selfでは、データがうまくいかず、わからないテキストが残ってしまいます。私の問題の

「短い」イラスト:

<html> 
# a lot of html before my node I want to grab... 
<div class="Pressemitteilungen"> 
    <div class="doctype">unwanted</div> 
    <h1 class="something">unwanted</h1> 
    <p>wanted data</p> 
    <p>wanted data 
    <span lang=\"en-GB\" xml:lang=\"en-GB\" xml:lang=\"en-GB\">wanted data</span> 
    </p> 
    <p>wanted data</p> 
    <blockquote> 
    <p>wanted data</p> 
    </blockquote> 
    <p class="msSomething">wanted data</p> 
    <p class="msSomethingElse">wanted data</p> 
    <ul> 
    <li> wanted data</li> 
    </ul> 
</div> 
# a lot of stuff after my node I want to grab... 
</html> 

私は必要としないいくつかのデータが含まれている完全なノードを、つかむ理由は、どのように伝えるのない現実的な方法がないことです私は期待できるので、つかむ必要があります。場合によっては、データは<p><p class="msSomething">または<p class="msSomethingElse">などでラップされます。だから私はノードから不要なものを削除するのではなく、個別に正しいタグを探すために容易になるだろうと思いました。我々はまた、多くのデータを話す。 (30.000+)

例えば、このプレスリリースを取る: http://www.bmas.de/DE/Presse/Pressemitteilungen/2014/2014_02_13_arbeitnehmerfreizuegigkeit.html

をあなたのアイデアを使用して、私はこのように私のデータをつかむ:限り、私はまだテキストが同じよう台無しになっ//text()を使用するよう

docContent <- xml_text(xml_find_all(html.raw, xpath="(//div[@class='article-text singleview']//p[@class='MsoNormal']| 
            //div[@class='article-text singleview']//h2| 
            //div[@class='article-text singleview']//blockquote)//text()")) 

この:

[18] "\ nMinisterハサンAdemov:"
[19]「ダイbulgarische Regierung帽子のSiCHイメル"21" "EU"
[21] " - Rechtsvorschriften zurArbeitnehmerfreizügigkeitausgesprochen。オーシュWIRschätzenダイVorteile Freizügigkeitウントihre正AuswirkungのAUFダイWirtschaft innerhalb DERをDER "
- デEuropäischenParlamentsウントデア"
[22] "EU"
[23]" -Kommissionüberein Unsere位置stimmt MITデア [24] "EU"
[25]」。 Gleichzeitig anerkennen WIR、DASS MIT Rechtenオーシュイメル entsprechende Pflichten verbundenシンド。 「

この理由は、テキスト内のこの<abbr title="Europäische Union">EU</abbr>ような注釈している私は、XPathから//text()を削除すると、テキストが完全に構造化されているが、私はこのような不要なデータを削除することはできません:。([not(ancestor-or-self::div[@class='sectionRelated'])]

ので、 、任意の助けをいただければ幸いです...

+1

はあなたが作るでした:不要なh2タグ「オーディオ」と「Weitere Informationenは」<div class="sectionRelated">さらに内に囲まれているので、私は信じていることは、あなたの希望する結果(私はまだ試してみて、あなたが実際に欲しいものを推測する必要が)ありますあなたの例の再現ible?例えば。 *アン*所望の出力だけでなく、ご希望の出力の例を生成する行の最小数を含む「HERE MINIMAL例」XML2 :: read_html( ' - あなたは' html.raw <のような行を追加することができます。 –

+0

私はHTMLの基本構造を追加しました。 – SimGeh

答えて

0

%%%%%%反復= 1:あなたのHTMLデータの乱雑を考えると(まだ)

成功していない、私たちはに来なければならないと思われます反復的な方法での解法です私の第一のショット:今すぐ

library(xml2) 

html.raw <- xml2::read_html('<html> 
# a lot of html before my node I want to grab... 
<div class="Pressemitteilungen"> 
    <div class="doctype">unwanted 1</div> 
    <h1 class="something">unwanted 2</h1> 
    <p>wanted data 1</p> 
    <p>wanted data 2</p> 
    <p>wanted data 3</p> 
    <blockquote> 
    <p>wanted data 4</p> 
    </blockquote> 
    <p class="msSomething">wanted data 5</p> 
    <p class="msSomethingElse">wanted data 6</p> 
    <ul> 
    <li> wanted data 7</li> 
    </ul> 
</div> 
# a lot of stuff after my node I want to grab... 
</html>') 

print(docContent <- xml_text(xml_find_all(html.raw, xpath="(//p|//li)//text()"))) 

あなたの文書は「データを望んでいた」として、より多くの一部内同じタグを他のタグ内の「データを望んでいた」、または可能性も「不要なデータ」が含まれている場合、その後、あなたを更新してください関連するケースの最小限の例を示し、そこから取り上げます。

%%%%%%反復= 2:ph2と前に、単一のバックスラッシュを使用して(と問題の//text()を削除)、あなただけのリンク特定のプレスリリースではD

生成します近づい

xpath <- "(//div[@class='article-text singleview']/p[@class='MsoNormal']| 
      //div[@class='article-text singleview']/h2| 
      //div[@class='article-text singleview']/blockquote)" 
docContent <- xml_text(xml_find_all(html.raw, xpath=xpath)) 
+0

ありがとうございました。私はまだ 'text()'を適用するとテキストが乱雑になるという問題があります。 – SimGeh

+0

自分の例で乱雑さはどのように現れますか? –

+0

上記の2つのブロッククォートボックスに乱雑が見えます。私はなぜそれが起こるかもしれないかについても説明しましたが、理由はわかりません。 – SimGeh

関連する問題