2016-08-16 92 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'])]")) 

在大多數情況下,獲取內容(通常是較長的文本)工作正常。但在某些情況下,例如當文章中有一些鏈接放入文本中時,它可能看起來像一團糟。一個解析的文字應該是這樣的:

上午Donnerstag(12.01)wirdBundesaußenminister弗蘭克 - 瓦爾特·博士 施泰因邁爾IMAuswärtigen金額MIT seinen Amtskollegen AUS GroßbritannienUND AUS Frankreich,傑克·斯特勞UND菲利普 ·杜斯特 - 布拉齊,sowie dem HohenRepräsentantender EUfürdie Gemeinsame Außen-und Sicherheitspolitik,Javier Solana,zusammenkommen。 Thema des Treffens wird das iranische Nuklearprogramm sein。

,但看起來是這樣的:

上午Donnerstag(12.01)wirdBundesaußenminister弗蘭克 - 瓦爾特·博士 施泰因邁爾IMAuswärtigen金額MIT seinen Amtskollegen AUS GroßbritannienUND AUS Frankreich,

傑克稻草

und

Philippe Dou STE - 布拉

,sowie DEM霍恩Repräsentanten德歐盟獻給死去GemeinsameAußen-UND Sicherheitspolitik,

索拉納

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

問題是,在文本里面有一些用不同的語言寫的文字,作者喜歡說明這一點。例如,名稱「Jack Straw」被引用如下:

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

拿這個PRESSRELEASE例如: http://www.bmas.de/DE/Presse/Pressemitteilungen/2014/2014_02_13_arbeitnehmerfreizuegigkeit.html

使用你的想法我搶我的數據是這樣的:

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()")) 

只要我仍然可以使用//text()文本變得像搞砸此:

[18] 「\ nMinister哈桑Ademov:」
[19]「模具bulgarische Regierung帽子SICH音麥fürdievollständige Anwendung der「
[20]」EU「
[21]」-Rechtsvorschriften zurArbeitnehmerfreizügigkeitausgesprochen。 Unsere位置stimmt MIT DER DESEuropäischenParlaments und明鏡「
[22] 」EU「
[23] 」-Kommissionüberein - 奧赫WIRschätzen死Vorteile明鏡 FreizügigkeitUND IHRE正Auswirkung奧夫模具Wirtschaft innerhalb DER「
[24]「EU」
[25]「。 Gleichzeitig anerkennen wir,dass mit Rechten auch immer entsprechende Pflichten verbunden sind。 「

這樣做的原因是這樣的<abbr title="Europäische Union">EU</abbr>文本中的註釋當我從XPath的刪除//text()文字結構完美,但我不能刪除這樣不需要的數據:([not(ancestor-or-self::div[@class='sectionRelated'])]

所以,任何幫助將不勝感激......

+1

你能不能做你的例子再現IBLE?例如。您可以添加一行,如'html.raw < - xml2 :: read_html(「 MINIMAL EXAMPLE HERE」'包含生成* un *所需輸出的最少行數,以及所需輸出的示例。 –

+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:越來越近:d

對於剛鏈接的特定新聞稿,使用單個反斜槓之前ph2和(和去除有問題的//text())產生我相信這是你想要的結果(我還是要嘗試猜你真正想要的東西),因爲不需要h2標籤「音頻」和「更多信息」的範圍內進一步<div class="sectionRelated">封閉:

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

你可以看到上面兩個blockquote框中的混亂。我也描述了什麼可能導致它,雖然我不知道爲什麼... – SimGeh