R ішіндегі жолдан HTML-тегтерді жою

Мен веб-беттің R көзін оқуға тырысамын және оны жолдар ретінде өңдеуге тырысамын. Мен абзацтарды алып, абзац мәтінінен html тегтерін алып тастауға тырысамын. Мен келесі мәселеге жүгіремін:

Html тегтерін жою үшін функцияны қолдануға тырыстым:

cleanFun=function(fullStr)
{
 #find location of tags and citations
 tagLoc=cbind(str_locate_all(fullStr,"<")[[1]][,2],str_locate_all(fullStr,">")[[1]][,1]);

 #create storage for tag strings
 tagStrings=list()

 #extract and store tag strings
 for(i in 1:dim(tagLoc)[1])
 {
   tagStrings[i]=substr(fullStr,tagLoc[i,1],tagLoc[i,2]);
 }

 #remove tag strings from paragraph
 newStr=fullStr
 for(i in 1:length(tagStrings))
 {
   newStr=str_replace_all(newStr,tagStrings[[i]][1],"")
 }
 return(newStr)
};

Бұл кейбір тегтерде жұмыс істейді, бірақ барлық тегтер емес, мысалы, бұл сәтсіздікке келесі жол:

test="junk junk junk junk"

Мақсатты алу:

cleanFun(test)="junk junk junk junk"

Алайда, бұл жұмыс істемейді. Мен бұл жолдың ұзындығы мен құтылу символдарымен айналысатын болар еді деп ойладым, бірақ олармен байланысты шешім таба алмадым.

18
Мұнда көп нәрсе бар ... Бастау үшін, бұл R, сондықтан ешқандай ; . Негізінен gsub және сәйкес тұрақты өрнек іздейсіз (бұл жағдайда, бұрыннан жауап берілді: stackoverflow.com/questions/10225690/… ). Код бойынша басқа да мәселелер бар ( dim (tagLoc) [1] - бұл сіз ойлаған нәрсені жасамайды), бірақ менің ойымша, бұл мәселе
қосылды автор alexwhan, көзі
Кодқа кіргенде жасалған қателерді түзету үшін өңделді.
қосылды автор Ryan Warnick, көзі

7 жауаптар

Бұған жай өрнектер арқылы және grep отбасының көмегімен қол жеткізуге болады:

cleanFun <- function(htmlString) {
  return(gsub("<.*?>", "", htmlString))
}

Сонымен қатар, сол жолда бірнеше HTML-тегтермен жұмыс істейді!

36
қосылды
« Әрдайым қалыпты өрнектермен HTML-ды талдауға тырысқан кезде, нәзік бала қыздардың қанын жояды, ал орыс хакерлері сіздің webapp-іңізді » бұл жартылай жауап .
қосылды автор geotheory, көзі
Негізінен ол не істейді? «<. *?>» htmlString 'үлгісінің кез-келген данасын табады және оны > « бос жолымен ауыстырады нәтижені қайтарады. Сәйкестендіру үлгісі үшін сізге тұрақты өрнектерді үйрену керек. «. *?» - ? - бұл сәл күрделірек бөлік болып табылмайды, сондықтан сізде бірнеше тегтер болса, мысалы « junk «бүкіл жолдың орнына» «және» «сәйкес болады.
қосылды автор Scott Ritchie, көзі
Жақсы мен итермелеймін - жою! = Талдау
қосылды автор Scott Ritchie, көзі

xml қолданатын tm.plugin.webmining қолданатын басқа тәсіл.

> library(tm.plugin.webmining)
> extractHTMLStrip("junk junk junk junk")
[1] "junk junk junk junk"
9
қосылды
+1 өте қызықты. Мен осы пакетті пайдаланған жоқпын.
қосылды автор user1609452, көзі

Сондай-ақ, оны оралу бумасындағы екі функциямен орындауға болады:

library(rvest)

strip_html <- function(s) {
    html_text(read_html(s))
}

Note that you should not use regexes to parse HTML.

7
қосылды

Қап пакетін қолданатын тәсіл:

library(qdap)
bracketX(test, "angle")

## > bracketX(test, "angle")
## [1] "junk junk junk junk"
5
қосылды
Мен сіздің пакетіңізді орнатып, әр түрлі функцияларға арналған бастапқы кодты қарап шықтым. bracketX - мәселенің жалпы жалпы сыныбы үшін өте пайдалы. Басқа құрал-жабдықтар үшін.
қосылды автор user1609452, көзі

It is best not to parse html using regular expressions. RegEx match open tags except XHTML self-contained tags

xml сияқты буманы пайдаланыңыз. htmlParse , мысалы, html кодын пайдаланып, оны талдаңыз және сізге қатысты шамаларды табу үшін xpaths пайдаланыңыз.

UPDATE:

ОС сұрағына жауап беру үшін

require(XML)
xData <- htmlParse('yourfile.html')
xpathSApply(xData, 'appropriate xpath', xmlValue)
3
қосылды
Сіз берген сілтеме HTML-ге арналған regex ұсынған кезде жиі беріледі, бірақ шын мәнінде ереже емес, тек қана нұсқаулық болып табылады. Мүмкіндігінше, xml (және т.б.) пайдаланылуы керек, бірақ кейде бұл мүмкін емес немесе мүмкін емес екеніне келісемін. Тек HTML + regex = bad деп ойлау үшін шешім қабылдаудан аулақ болу керек. Кейде regex дұрыс. Біз деректер пішімін немесе дереккөзді білмейміз. Бұл 2 рет дауыс берілді, бірақ ОС-ға жауап бермейді.
қосылды автор Tyler Rinker, көзі
Бұл жағдайда да қолданылады ма? Ол тегтерді мүлдем талдағысы келмейді, ол оларды тастағысы келеді.
қосылды автор Scott Ritchie, көзі
ОП, xpathSapply (doc, 'somepath', xmlValue) пайдалануды жөн көреді.
қосылды автор user1609452, көзі
ОП ең соңында не керек екенін білмеді. Олар регерстің пайда болуын парсер ретінде пайдаланатын қысқа эскизді ұсынды. ОС-қа хабар бермеу дұрыс емес, бұл әрқашан жаман идея емес, жиі кездеседі.
қосылды автор user1609452, көзі

Ішкі немесе гсубпен оңайырақ болуы мүмкін бе?

> test  <- "junk junk junk junk"
> gsub(pattern = "<.*>", replacement = "", x = test)
[1] "junk junk junk junk"
2
қосылды
Бұл кодымен 1 мәселе болуы мүмкін, ол < бірінші көрінісінің орнына > соңғы көрінісін ауыстырады. сондықтан бірнеше HTML-тегтер болғанда, бұл мәселе болуы мүмкін
қосылды автор joel.wilson, көзі

Біріншіден, сіздің тақырыптық желіңіз жаңылыс; сіз орналастырған жолда кері соққылар жоқ. Сіз классикалық қателіктердің біріне жәбірленесіз: Азиядағы жер соғысына араласқандықтан емес, бәрібір ерекше. Күтуге болатын таңбаларды кәдімгі кері қиғаштар үшін белгілеу үшін R-ны \ қолдануға қате жіберіңіз. Бұл жағдайда \ « екі әріптік белгілерді емес, \ және » деген қос тырнақшаны білдіреді. Сіз cat функциясын пайдалана аласыз, егер құтқарылған таңбаларды нақты түрде қарастыратын болсаңыз, қандай жол шынымен көрінетінін көруге болады.

Екіншіден, сіз HTML-ды талдау үшін тұрақты өрнектерді пайдаланасыз. (Олар сіздің кодаңызда көрсетілмейді, бірақ олар str_locate_all және str_replace_all ) бөлімінде қолданылған.) Бұл басқа классикалық қателіктер; көбірек экспозиция үшін мұнда қараңыз.

Үшіншіден, сенің постыңызда stringr бумасын пайдаланып жатқанын айтқан боларсыз, бірақ бұл салыстыру арқылы аз ғана қате.

2
қосылды
Тақырып жолағы қате болды, оны редакциялады.
қосылды автор Ryan Warnick, көзі