Извлечение простого текста из html-файлов в R [дубликат]

Переход между 2.x и 3.x не слишком экстремален, но он меняет некоторые вещи. raw_input теперь просто вводится, если вы хотите использовать старый вход, просто выполните:

eval(input())

Так что просто забудьте raw:)

19
задан Ryan Warnick 21 June 2013 в 04:57
поделиться

7 ответов

Это может быть достигнуто просто с помощью регулярных выражений и семейства grep:

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

Это также будет работать с несколькими тегами html в одной строке!

36
ответ дан Scott Ritchie 17 August 2018 в 15:54
поделиться
  • 1
    В основном, что он делает, он находит любые экземпляры шаблона "<.*?>" in the htmlString 'и заменяет его пустой строкой "" и возвращает результат. Для сопоставления шаблонов вам нужно изучить регулярные выражения. Единственная немного сложная часть - ".*?", ? делает ее не жадной, поэтому, если у вас есть несколько тегов, например, & quot; & lt; a & gt; мусор & lt; / a & gt; он будет соответствовать & quot; & lt; a & gt; и "& lt; / a & gt;" а не целую строку. – Scott Ritchie 21 June 2013 в 05:13
  • 2
    « Каждый раз, когда вы пытаетесь проанализировать HTML с помощью регулярных выражений, нечестивый ребенок плачет кровью девственниц, а русские хакеры pwn your webapp & quot; Из этот семантический ответ . – geotheory 6 January 2018 в 03:01
  • 3
    Хорошо, я укушу - удаление! = Разбор – Scott Ritchie 6 January 2018 в 04:52

Во-первых, ваша строка темы вводит в заблуждение; в строке, которую вы разместили, нет обратных косых черт. Вы стали жертвой одного из классических промахов: не так плохо, как участвовать в наземной войне в Азии, но все равно. Вы ошибаетесь в использовании R \ для обозначения экранированных символов для литеральных обратных косых черт. В этом случае \" означает знак двойной кавычки, а не два буквальных символа \ и ". Вы можете использовать cat, чтобы увидеть, что на самом деле будет выглядеть строка, если бы экранированные символы обрабатывались буквально.

Во-вторых, вы используете регулярные выражения для синтаксического анализа HTML. (Они не отображаются в вашем коде, но они используются под капотом в str_locate_all и str_replace_all.) Это еще один из классических промахов; см. здесь для более подробной информации.

В-третьих, вы должны упомянуть в своем посте, что используете пакет stringr, но это лишь незначительная ошибка при сравнении.

7
ответ дан Community 17 August 2018 в 15:54
поделиться
  • 1
    Строка темы была ошибкой, отредактировала ее. – Ryan Warnick 21 June 2013 в 04:55
  • 2
    Это применимо в этом случае? Он вообще не хочет разбирать теги, он хочет их разбить. – Scott Ritchie 21 June 2013 в 06:50
  • 3
    OP, вероятно, просто хочет использовать xpathSapply(doc, 'somepath', xmlValue). – user1609452 21 June 2013 в 06:55
  • 4
    Ссылка, которую вы указали, предоставляется так часто, когда когда-либо кто-то предлагает регулярное выражение для HTML, но это действительно просто руководство, а не правило. Я согласен с тем, что XML (и т. Д.) Следует использовать, если это возможно, но иногда это невозможно или непрактично. Просто думать, что HTML + regex = bad избегает принятия решений. Иногда регулярное выражение является подходящим. Мы не знаем формат данных или источник. Это голосование было проголосовано 2 раза, но на самом деле не дает OP ответа. – Tyler Rinker 21 June 2013 в 14:51
  • 5
    ОП подробно рассказала о том, чего они в конечном итоге хотят. Они предоставили краткий эскиз, в котором используется выражение регулярного выражения, используемое в качестве парсера. Было бы неправильно не сообщать ОП, что это очень часто, если не всегда плохая идея. – user1609452 21 June 2013 в 16:03

Может быть проще с sub или gsub?

> test  <- "junk junk<a href=\"/wiki/abstraction_(mathematics)\" title=\"abstraction (mathematics)\"> junk junk"
> gsub(pattern = "<.*>", replacement = "", x = test)
[1] "junk junk junk junk"
2
ответ дан PAC 17 August 2018 в 15:54
поделиться
  • 1
    1 с этим кодом может быть, он заменяет первый вид < на последний вид >. поэтому, когда есть несколько тегов html, это может быть проблемой – joel.wilson 16 February 2017 в 20:27

Другой подход, использующий tm.plugin.webmining, который внутренне использует XML.

> library(tm.plugin.webmining)
> extractHTMLStrip("junk junk<a href=\"/wiki/abstraction_(mathematics)\" title=\"abstraction (mathematics)\"> junk junk")
[1] "junk junk junk junk"
9
ответ дан Peyton 17 August 2018 в 15:54
поделиться

Подход с использованием пакета qdap:

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

## > bracketX(test, "angle")
## [1] "junk junk junk junk"
5
ответ дан Tyler Rinker 17 August 2018 в 15:54
поделиться
  • 1
    Я установил ваш пакет и посмотрел исходный код для различных функций. bracketX очень полезен для гораздо более общего класса проблем. Еще один для инструментария. – user1609452 21 June 2013 в 18:11
7
ответ дан Community 6 September 2018 в 10:24
поделиться
9
ответ дан Motin 29 October 2018 в 17:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: