我遇到了一些解析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'])]
)
所以,任何帮助将不胜感激......
你能不能做你的例子再现IBLE?例如。您可以添加一行,如'html.raw < - xml2 :: read_html(“ MINIMAL EXAMPLE HERE”'包含生成* un *所需输出的最少行数,以及所需输出的示例。 –
我添加了HTML的基本结构。 – SimGeh