我刚刚开始在R中使用XML
包,而我在从xml列表中提取字符串时遇到问题:
> library("XML")
> library("stringr")
> url = "html-1.html"
> parsed_doc = htmlParse(file=url, useInternalNodes = TRUE)
> products <- getNodeSet(doc = parsed_doc, path = "//li[contains(.,Product ID')]")
> products
[[1]]
<li>
Product ID:
000002434482
</li>
[[2]]
<li>
Product ID:
000002183105
</li>
[[3]]
<li>
Product ID:
000002183105
</li>
我想创建一个包含每个ID的向量。我已经尝试了一些正则化的表达式来提取12位数的产品ID但似乎无法使其工作。
> mrn <- str_extract(products , "[[:digit:]{12}")
> mrn <- str_extract(products , "[[:digit:]+
]")
> mrn <- str_extract(products , "[0-9]+
")
我想知道列表结构是否与它有关或可能是间距?
我也尝试了> mrn <- str_extract(products , ".{16}")
但是,R会返回指针值"<pointer: 0x6815"
- 我认为这很接近,但我不确定这意味着什么。
答案 0 :(得分:1)
你快到了。节点集不是字符串向量,您需要首先从中获取字符串值。您可以使用xmlValue
轻松提取它们,然后您可以使用str_extract
(或str_extract_all
):
> v <- sapply(products, xmlValue)
> v
[1] "\r\n Product ID:\r\n 000002434482\r\n"
[2] "\r\n Product ID:\r\n 000002183105\r\n"
[3] "\r\n Product ID:\r\n 000002183105\r\n "
> unlist(str_extract_all(v, "[[:digit:]]+"))
[1] "000002434482" "000002183105" "000002183105"
如果ID是仅包含12位数的整个单词,则可以使用更精确的表达式,如
"\\b[[:digit:]]{12}\\b"
其中\b
是单词边界,{12}
是限制性量词,恰好匹配12位数字。
或者,您也可以使用匹配str_match
+空格+ {12}整数字的Product ID:
和Product ID:\s*(\d{12})\b
regex来提取这些ID(因此,我们需要使用str_match
而不是str_extract
):
> res <- unlist(str_match(v, "Product ID:\\s*(\\d{12})\\b"))
> res[,2]
[1] "000002434482" "000002183105" "000002183105"