определение узла xpath - PullRequest
       4

определение узла xpath

1 голос
/ 05 июля 2011

Я новичок в изучении и пытаюсь понять xpath, используя R. Моя цель - создать вектор людей с этого сайта. Я могу сделать это, используя:

r<-htmlTreeParse(e) ## e is after getURL 
    g.k<-(r[[3]][[1]][[2]][[3]][[2]][[2]][[2]][[1]][[4]])
    l<-g.k[names(g.k)=="text"]
    u<-ldply(l,function(x) {

        w<-xmlValue(x)
        return(w)
        })

Однако это громоздко, и я бы предпочел использовать xpath. Как мне перейти по пути, указанному выше? Есть ли для этого функция или я могу отправить свой путь, как указано выше?

Я пришел к

xpathApply( htmlTreeParse(e, useInt=T), "//body//text//div//div//p//text()", function(k) xmlValue(k))->kk

Но это оставляет мне много работы по уборке, и я предполагаю, что это можно сделать лучше.

С уважением, // M

РЕДАКТИРОВАТЬ: Извините за неясность, но я новичок в этом и довольно смущен. К сожалению, документ XML слишком большой, чтобы его можно было вставить. Я предполагаю, что мой вопрос заключается в том, существует ли какой-либо простой способ найти имя этих узлов / структуры документа, кроме использования источника представления? Я подошел немного ближе к тому, что мне нравится:

getNodeSet(htmlTreeParse(e, useInt=T), "//p")[[5]]->e2

дает мне список того, что я хочу. Однако все еще в xml с тегами br. Я думал, что работает

xpathApply(e2, "//text()", function(k) xmlValue(k))->kk

предоставит список, который позже может быть не включен в список. однако в нем содержится больше мусора, чем в e2.

Есть ли способ сделать это напрямую:

xpathApply(htmlTreeParse(e, useInt=T), "//p[5]//text()", function(k) xmlValue(k))->kk

Ссылка на веб-страницу: я пытаюсь получить имена и только имена со страницы.

getURL("http://legeforeningen.no/id/1712")

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Я закончил с

xml = htmlTreeParse("http://legeforeningen.no/id/1712", useInternalNodes=TRUE)

(нет необходимости в RCurl), а затем

sub(",.*$", "", unlist(xpathApply(xml, "//p[4]/text()", xmlValue)))

(подмножество в xpath), которое оставляет последнюю строку, которая не является именем. Можно также выполнить обработку текста в XML, но затем выполнить итерацию на уровне R.

n <- xpathApply(xml, "count(//p[4]/text())") - 1L
sapply(seq_len(n), function(i) {
    xpathApply(xml, sprintf('substring-before(//p[4]/text()[%d], ",")', i))
})

К сожалению, это не позволяет подобрать имена, которые не содержат запятую.

0 голосов
/ 05 июля 2011

Используйте смесь xpath и манипуляции со струнами.

#Retrieve and parse the page.
library(XML)
library(RCurl)
page <- getURL("http://legeforeningen.no/id/1712")
parsed <- htmlTreeParse(page, useInternalNodes = TRUE)

Проверка переменной parsed, которая содержит источник страницы, говорит нам о том, что вместо разумного использования тега списка (например, <ul>) автор просто поместил абзац (<p>) текста, разбитого на разрывы строк (<br />). Мы используем xpath для извлечения элементов <p>.

#Inspection tells use we want the fifth paragraph.
name_nodes <- xpathApply(parsed, "//p")[[5]]

Теперь мы конвертируем в символ, разбиваем на теги <br> и удаляем пустые строки.

all_names <- as(name_nodes, "character")
all_names <- gsub("</?p>", "", all_names)
all_names <- strsplit(all_names, "<br />")[[1]]
all_names <- all_names[nzchar(all_names)]
all_names

При желании можно разделить имена людей и их местонахождение.

strsplit(all_names, ", ")

Или более красиво с stringr.

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