>我有以下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。但是,我肯定知道choice1
、choice2
和choice3
的价值(基本上其他所有东西,我知道这些类将被称为list
、lvl2
和lvl3
)。
尝试一个可重现的例子:
.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"
如果你知道这些类将被称为 list
、 lvl2
和 lvl3
,然后你的文本将出现在带有类 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的评论,有时有必要区分john
和saint john
和johnny
。 可能有基于 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。