0

我有一系列链接到处方药标签的数千个 URL,并试图找出有多少有患者包装插页。我试图通过读取数据框中的 URL,然后使用 XML 包来解析 html,并最终使用 grep 来执行我对字符串“Patient Package Insert”的搜索。最终,我试图计算带有患者包装插页的处方药标签的数量。

我在下面整理了一个玩具示例:

library(XML)
urls <- c("http://dailymed.nlm.nih.gov/dailymed/lookup.cfm?setid=a002b40c-097d-47a5-957f-7a7b1807af7f",
         "http://dailymed.nlm.nih.gov/dailymed/lookup.cfm?setid=1842bb9f-60ab-4af9-95a4-1cfc3645ee6b", 
         "http://dailymed.nlm.nih.gov/dailymed/lookup.cfm?ndc=50419-758&start=1&labeltype=all")

Data <- data.frame(urls)
Data$insert <- lapply(Data$urls, function(x) {
   y <- xmlToList(htmlParse(x))
   y.flat <- unlist(y, recursive = TRUE)
   length(grep("Patient Package Insert", c(y.flat,names(y.flat))))
})

Data <- as.data.frame(lapply(Data, unlist))
count(Data$insert)

目前,这正在获取每个网页中包含的“患者包裹插页”链接,但只有其中一些是活动的。例如,上面玩具示例中包含的第二个和第三个 URL 没有指向“患者包装插页”的活动链接(它是灰色的),我不想将其计入我的最终表格中。理想情况下,我只想标记第一个链接,其中包括一个功能性的“患者包裹插入”链接。有谁知道如何最好地在 R 中做到这一点?如果是这样,我将不胜感激任何和所有的帮助。

非常感谢,

克里斯

4

2 回答 2

1

您可以使用以下内容:

xData <- lapply(Data$urls, htmlParse)
ppiData <- lapply(xData, FUN = xpathApply, path = "/descendant-or-self::*[contains(@title, 'Patient Package Insert')]", fun = xmlAttrs)
ppiData

[[1]]
[[1]][[1]]
                   title                     href                    class 
"Patient Package Insert"            "#nlm42230-3"            "nlmlinktrue" 


[[2]]
[[2]][[1]]
                   title                     href                    class 
"Patient Package Insert"            "#nlm42230-3"           "nlmlinkfalse" 


[[3]]
[[3]][[1]]
                   title                     href                    class 
"Patient Package Insert"            "#nlm42230-3"           "nlmlinkfalse" 

在这个简单的示例中,您可以处理数据框:

ppiData <- lapply(ppiData, function(x){data.frame(as.list(x[[1]]))})
ppiData <- do.call(rbind, ppiData)

> ppiData
                   title        href        class
1 Patient Package Insert #nlm42230-3  nlmlinktrue
2 Patient Package Insert #nlm42230-3 nlmlinkfalse
3 Patient Package Insert #nlm42230-3 nlmlinkfalse

使用您的真实数据集,第二步可能会涉及更多可能的多个条目等。

于 2013-07-13T04:27:15.310 回答
0

如果您查看返回的 HTML 值,而不仅仅是 greppish 值,您会发现:

$body$div$div$fieldset$div$ul$li$a$.attrs
                   title                     href                    class 
"Patient Package Insert"            "#nlm42230-3"           "nlmlinkfalse" 

...但它上面的项目的类值为“nlmlinktrue”。所以也许你需要遍历所有不幸的未命名$body$div$div$fieldset$div$ul$li$a$.text节点来找到“Patient Package Insert”项目,然后看看它的$body$div$div$fieldset$div$ul$li$a$.attrs类值是什么。

当我在第三个项目上手动执行此操作时,我得到:

Data$insert[[3]]$body[14]$div[12]$div[2]$fieldset[3]$div[2]$ul[27]$li[2]

$a
$a$text
[1] "Patient Package Insert"

$a$.attrs
                   title                     href                    class 
"Patient Package Insert"            "#nlm42230-3"           "nlmlinkfalse" 

要手动完成,您可以使用 grep 查找包含“Package Insert”的下一个节点

> head(sapply( Data$insert[[3]], FUN=grep, patt="Package Insert" ))
$head
integer(0)

$body
[1] 14

$.attrs
integer(0)

> head(sapply( Data$insert[[3]]$body[14], FUN=grep, patt="Package Insert" ))
div 
 12 
> 
于 2013-07-12T23:56:11.910 回答