r语言 - Ho 我是否得到列表元素的 html = "some value" ?



>我有以下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>

我想获取== "choice2"元素的 HTML(外部 HTML、HTML + 元素、选择器、Xpath,没关系)

我怎样才能用RSelenium做到这一点?

谢谢

编辑澄清:列表元素的id是动态的(基本上是随机的),所以我需要的解决方案不能引用它们的 HTML 或 CSS。但是,我肯定知道choice1choice2choice3的价值(基本上其他所有东西,我知道这些类将被称为listlvl2lvl3)。

尝试一个可重现的例子:

.HTML:

<ul class="list" id="list1">
  <li class="lvl2">
    <div class="lvl3" id="n123">
      paul
    </div>
  </li>
  <li class="lvl2">
    <div class="lvl3" id="n471">
      john
    </div>
  </li>
  <li class="lvl2">
    <div class="lvl3" id="n951">
      ringo
    </div>
  </li>
</ul>

R :

> library(RSelenium)
> startServer()
> mybrowser <- remoteDriver()
> mybrowser$open()
> mybrowser$navigate("http://example.com")
> list_of_beatles <- mybrowser$findElement(using = 'css selector', "ul#list.list1")
> print(unlist(strsplit(as.character(list_of_beatles$getElementText()), "n")))
[1] "paul"                              "john"              
[3] "ringo"
> # Let's say I want john's CSS selector, I'd want somethign kind of like that :
> css_selector_of_this_thing(which(unlist(strsplit(as.character(list_reponse$getElementText()), "n")) == "john"))
> # Which would output, for instance "div#lvl3.n471" 

如果你知道这些类将被称为 listlvl2lvl3,然后你的文本将出现在带有类 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      johnn    </div>">
result$getElementTagName()[[1]] # or result$getElementAttribute("tag")[[1]]
# [1] "div"
result$getElementAttribute("class")[[1]]
# [1] "lvl3"
result$getElementAttribute("id")[[1]]
# [1] "n471"

或者更简单地说:

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

编辑:

根据OP的评论,有时有必要区分johnsaint johnjohnny。 可能有基于 xpath 的方法可以解决这个问题,但我还没有弄清楚(欢迎建议/编辑)。 因此,我将在初始 xpath 之后使用一些正则表达式:

# 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")))

假设我们添加了johnny作为另一个条目,那么choices如下所示:

#[1] "<div class="lvl3" id="n123">n      pauln    </div>"  
#[2] "<div class="lvl3" id="n471">n      johnn    </div>"  
#[3] "<div class="lvl3" id="n951">n      ringon    </div>" 
#[4] "<div class="lvl3" id="n952">n      johnnyn    </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      johnn    </div>"

上面显示的方法将用于在此处获取标记名称、类和 id。

最新更新