HTMLunit 迭代节点

HTMLunit iterate nodes

我尝试迭代 html 个节点并从该节点获取信息。

这是 html 示例:

<div class="less1">
  <h4>Test name 1</h4>
  <div>
     <div id="email">test1@test.com</div>
     <div id="email">test2@test.com</div>
     <div id="email">test3@test.com</div>
  </div>
</div>
<div class="less1">
  <h4>Test name 2</h4>
  <div>
     <div id="email">test_name1@test.com</div>
     <div id="email">test_name2@test.com</div>
     <div id="email">test_name3@test.com</div>
  </div>
</div>
<div class="less1">
  <h4>Test name 3</h4>
  <div>
     <div id="email">test_name_3@test.com</div>
  </div>
</div>
<div class="less1">
  <h4>Test name 4</h4>
</div>

这是我的代码示例。

final List<HtmlListItem> nodes = htmlPage.getByXPath("//*[@class=\"less1\"]");

for (HtmlListItem node: nodes) {
   final List<?> divs = node.getByXPath("//h4/text()");
}

"divs" 列表大小始终为 4。

是否可以从当前节点只得到1个结果?

要仅获取第一个匹配元素,请使用 getFirstByXPath:

final List<?> divs = node.getFirstByXPath("//h4/text()");

如果您需要索引的特定元素:

final Object div = node.getByXPath("//h4/text()").get(index);

更新

也许问题出在绝对 xpath 的使用上。 尝试在每个节点上使用相对路径:

String text = node.getByXPath("h4/text()");
List<String> emails = node.getByXPath("div/div");

否则你可以从探索子节点的每个节点提取数据

for (HtmlListItem node: nodes) {
    NodeList children = node.getChildNodes();
    for (int i = 0; i < children.getLength(); i++) {
       Node child = children.item(i);
       /** extract data from child **/
    }       
}