2016-08-16 89 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