R 我如何得到一个列表元素的html,它==";一些价值观;?

R 我如何得到一个列表元素的html,它==";一些价值观;?,r,rselenium,R,Rselenium,我有以下HTML代码: <ul class="list" role="listbox" id="list1"> <li class="lvl2"> <div class="lvl3" id="lvl3-nb-1"> choice1 </div> </li> <li class="lvl2"> <div class="lvl3" id="lvl3-nb-2">

我有以下HTML代码:

<ul class="list" role="listbox" id="list1">

  <li class="lvl2">
    <div class="lvl3" id="lvl3-nb-1">
      choice1
    </div>
  </li>

  <li class="lvl2">
    <div class="lvl3" id="lvl3-nb-2">
      choice2
    </div>
  </li>

  <li class="lvl2">
    <div class="lvl3" id="lvl3-nb-3">
      choice3
    </div>
  </li>

</ul>
R:

>库(RSelenium)
>startServer()
>mybrowser mybrowser$open()
>mybrowser$navigate(“http://example.com")
>披头士打印列表(未列出(strsplit(如.character(披头士列表$getElementText()),“\n”))
[1] “保罗”“约翰”
[3] “林戈”
>#假设我想要john的CSS选择器,我想要这样的东西:
>这个东西的css选择器(未列出(strsplit(as.character(list\u response$getElementText()),“\n”)==”john”))
>#哪个将输出,例如“div#lvl3.n471”

如果您知道类将被调用
list
lvl2
lvl3
,然后您的文本将在带有class
lvl3
的标记中,那么您可以使用
xpath

result <- mybrowser$findElement(using = 'xpath',
    ""//ul[@class = 'list']/*[@class = 'lvl2']/*[@class = 'lvl3'][contains(., 'john')]"")

result$getElementAttribute("outerHTML")[[1]]
# [1] "<div class=\"lvl3\" id=\"n471\">\n      john\n    </div>">

result$getElementTagName()[[1]] # or result$getElementAttribute("tag")[[1]]
# [1] "div"

result$getElementAttribute("class")[[1]]
# [1] "lvl3"

result$getElementAttribute("id")[[1]]
# [1] "n471"
假设我们添加了
johnny
作为另一个条目,那么
choices
将如下所示:

#[1] "<div class=\"lvl3\" id=\"n123\">\n      paul\n    </div>"  
#[2] "<div class=\"lvl3\" id=\"n471\">\n      john\n    </div>"  
#[3] "<div class=\"lvl3\" id=\"n951\">\n      ringo\n    </div>" 
#[4] "<div class=\"lvl3\" id=\"n952\">\n      johnny\n    </div>"
#[1]“\n paul\n”
#[2] “\n john\n”
#[3] “\n ringo\n”
#[4] “\n约翰尼\n”
然后,我们可以使用正则表达式找到正确的:

# \\W+ to look for non-word characters (i.e. [^[:alnum:]_])
# between the ">" and "<" that enclose the text 
choice <- which(grepl(">\\W+john\\W+<", choices, perl = TRUE))

result[[choice]]$getElementAttribute("outerHTML")[[1]]
#[1] "<div class=\"lvl3\" id=\"n471\">\n      john\n    </div>"
#\\W+查找非单词字符(即[^[:alnum:][u3])

#在“>”和“\\W+john\\W+之间,您要查找的标记有点模糊,但是使用
rvest
html%%>%read\u html()%%>%html\u节点('.\lvl3-nb-2')%%>%html\u文本(trim=TRUE)
。根据您的喜好进行调整。一个可复制的示例可能会有所帮助。我编辑了这个问题,希望能让它更清楚。好吧,它看起来几乎符合您的期望,非常感谢。不过有一个小问题:列表中的元素可以相似,例如
圣约翰
约翰·保罗
约翰尼
约翰
。我似乎
contains
会选择第一个,即使我想要一个精确的匹配项。知道使用什么吗?我对XPath一点都不熟悉。@fmalaussena检查编辑,看看是否适合您。
result2 <- mybrowser$findElement(using = 'xpath',
    "//*[@class = 'lvl3'][contains(., 'john')]")
# use findElements (plural) to get multiple elements
result <- mybrowser$findElements(using = 'xpath',
    "//*[@class = 'lvl3'][string()]")

# loop through results and gather outerHTML to examine with regex
choices <- unlist(lapply(result, function(x) x$getElementAttribute("outerHTML")))
#[1] "<div class=\"lvl3\" id=\"n123\">\n      paul\n    </div>"  
#[2] "<div class=\"lvl3\" id=\"n471\">\n      john\n    </div>"  
#[3] "<div class=\"lvl3\" id=\"n951\">\n      ringo\n    </div>" 
#[4] "<div class=\"lvl3\" id=\"n952\">\n      johnny\n    </div>"
# \\W+ to look for non-word characters (i.e. [^[:alnum:]_])
# between the ">" and "<" that enclose the text 
choice <- which(grepl(">\\W+john\\W+<", choices, perl = TRUE))

result[[choice]]$getElementAttribute("outerHTML")[[1]]
#[1] "<div class=\"lvl3\" id=\"n471\">\n      john\n    </div>"