Используйте substr с начальными и конечными словами вместо целых - PullRequest
1 голос
/ 22 мая 2019

Я хочу извлечь информацию из скачанного html-кода.HTML-код задается в виде строки.Необходимая информация хранится в промежутке между конкретными html-выражениями.Например, если я хочу иметь каждый заголовок в строке, я должен искать «H1>» и «/ H1>» и текст между этими HTML-выражениями.

До сих пор я использовал substr (), но сначала мне нужно было вычислить положение «H1>» и «/ H1>».

htmlcode = " some html code <H1>headline</H1> some other code <H1>headline2</H1> "
startposition = c(21,55) # calculated with gregexpr
stopposition = c(28, 63) # calculated with gregexpr
substr(htmlcode, startposition[1], stopposition[1])
substr(htmlcode, startposition[2], stopposition[2])

Вывод правильный, но вычислять каждый старт и остановку - большая работа.Вместо этого я ищу похожую функцию, например substr (), где вместо позиции можно использовать начальные и конечные слова.Например, вот так: функция (htmlcode, startword = "H1>", stopword = "/ H1>")

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Я бы согласился, что использование пакета, созданного для обработки html, вероятно, лучший способ справиться с примером, который вы приводите. Однако один из возможных способов подстроки строки, основанной на символьных значениях, заключается в следующем.

Шаг 1: Определите простую функцию для возврата к позиции символа в строке, в этом примере я использую только строки фиксированных символов.

strpos_fixed=function(string,char){
  a<-gregexpr(char,string,fixed=T)
  b<-a[[1]][1:length(a[[1]])]
  return(b)
}

Шаг 2: Определите вашу новую функцию подстроки, используя функцию strpos_fixed () , которую вы только что определили

char_substr<-function(string,start,stop){
  x<-strpos_fixed(string,start)+nchar(start)
  y<-strpos_fixed(string,stop)-1
  z<-cbind(x,y)
  apply(z,1,function(x){substr(string,x[1],x[2])})
}

Шаг 3: Тест

htmlcode = " some html code <H1>headline</H1> some other code <H1>headline2</H1> "
htmlcode2 = " some html code <H1>baa dee ya</H1> some other code <H1>say do you remember?</H1>"
htmlcode3<- "<x>baa dee ya</x> skdjalhgfjafha <x>dancing in september</x>"
char_substr(htmlcode,"<H1>","</H1>")
char_substr(htmlcode2,"<H1>","</H1>")
char_substr(htmlcode3,"<x>","</x>")
0 голосов
/ 23 мая 2019

У вас есть два варианта здесь. Во-первых, используйте пакет, специально разработанный для разбора HTML-структур, например, rvest. В Интернете есть несколько учебных пособий.

Во-вторых, для крайних случаев, когда вам может потребоваться извлечь из строк, которые не обязательно хорошо отформатированы HTML, вы должны использовать регулярные выражения. Одна из более простых реализаций для этого происходит от stringr::str_match:

# 1. the parenthesis define regex groups
# 2. ".*?" means any character, non-greedy
# 3. so together we are matching the expression <H1>some text or characters of any length</H1>

str_match(htmlcode, "(<H1>)(.*?)(</H1>)")

Это даст матрицу, в которой столбцы (в порядке) - это полностью совпадающая строка, за которой следует указанная нами независимая группа регулярных выражений. В этом случае вам просто нужно вытащить вторую группу, если вы хотите, чтобы любой текст был между тегами <H1> (3-й столбец).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...