2012-03-26 5 views
1

Ich benutze das Paket tm. Ich habe ein Korpus voller HTML-Dokument und ich möchte alles außer den HTML-Tags entfernen. Ich habe das seit ein paar Tagen versucht, aber ich finde keine gute Lösung.Entfernen Sie alles außer HTML-Tags aus einem Korpus

Zum Beispiel lassen Sie uns sagen, ich habe ein Dokument wie folgt aus:

<html> 
<body> 

<h1>hello</h1> 

</body> 
</html> 

ich das Dokument wie diese werden wollen würde:

<html> <body> <h1> 

(Oder mit den schließenden Tags, I don‘ t wirklich etwas dagegen.)

Mein Ziel ist es zu zählen, wie oft jedes Tag in einem Dokument verwendet wird.

Antwort

2

Ich bin nicht vertraut mit tm, aber hier ist, wie Sie es mit Regular Expressions tun können.

(Präsupposition: Zeichenfolge beginnt und endet mit einem HTML-Tag)

str <- "<html><body><p>test<p>test2</body></html>" 
str <- gsub(">[^<^>]+<", "> <", str) # remove all the text in between HTML tags, leaving only HTML tags (opening and closing) 
str <- gsub("</[^<^>]+>", "", str) #remove all closing HTML tags. 

dass Sie mit Ihrem gewünschten Zeichenfolge verlassen würde.

Wenn Sie neu bei RegEx sind, sehen Sie sich this site an, um weitere Informationen zu erhalten. Grundsätzlich wird der erste gsub oben den gesamten Text zwischen > und < ersetzen, der keine offene oder geschlossene Klammer ist (d. H. Alle Nicht-Tag-Text). Der zweite gsub wird der gesamte Text ersetzt, die mit </ beginnt und endet mit > mit nichts - die schließenden Tags aus dem String entfernt

+0

Dies könnte funktionieren, wenn er wirklich einfache HTML hat aber im Allgemeinen Sie kippt Parst html mit einem regulären Ausdruck . Zum Beispiel werden Attribute nicht herausgefiltert. – frankc

+2

@frankc Wenn Sie diesen Kommentar hinterlassen, sollten Sie wirklich auf [Die Frage] (http://stackoverflow.com/q/1732348/324364) verlinken. :) – joran

0

(1) gsubfn

Unter der Annahme, s wird die Eingabezeichenfolge (es Zeilenumbrüche enthalten kann) diese Spiele < durch irgendetwas gefolgt, die nicht /, > oder ein Raum ist und extrahiert es in Tags. Die table Funktion tabellarisch die Vorkommen:

library(gsubfn) 
tags <- strapply(tolower(s), "\\<([^/> ]+)", c, simplify = unlist) 
table(tags) 

Zum Beispiel

s <- "<html> 
<body> 

<h1>hello</h1> 

</body> 
</html>" 
tags <- strapply(tolower(s), "\\<([^/> ]+)", c, simplify = unlist) 
table(tags) 

ergibt dies:

tags 
body h1 html 
    1 1 1 

Wenn die Datei sehr groß ist dann the development version of gsubfn hat eine schnelle Version namens strapplyc.

(2) XML

Der obige Ansatz könnte verwirrt werden, wenn es < und > Symbole in Anführungszeichen und andere Grenzfälle.Es darf keine solche Fälle in Ihrem eingegeben wird sowieso, aber nur für den Fall dieses zweite Ansatz soll dieses Problem nicht hat:

library(XML) 
doc <- htmlTreeParse(tolower(s), asText = TRUE, useInternalNodes = TRUE) 
tags <- xpathSApply(doc, "//*", xmlName) 
table(tags)