我有一个程序,应该刮网址,并获得所有元素的值。元素如下所示:VALUE1 - VALUE3
或者它看起来像这样:VALUE1/VALUE2 - VALUE3
HTML文件看起来是这样的:
`<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li>
<a><span>VALUE1</span></a>
-
<span>VALUE3</span>
</li>
</ul>`
或者它可以这样看:
`<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li>
<a><span>VALUE1</span></a>
/
<a><span>VALUE2</span></a>
-
<span>VALUE3</span>
</li>
</ul>`
我需要得到第一个和第三个值,所以我首先抓取所有的VALUE 1并将其放入ArrayList中,然后对VALUE 3执行同样的操作。但问题是第3章并不总是在那里!有时,VALUE 3 span标签可能只是不存在于网站上。
因此,当我将VALUE 1和VALUE 3从2个列表添加到1个列表时,第一个列表可能会更大,这可能会导致IndexOutOfBoundsException。我想也许我可以在我的第二个列表中添加一些东西,如果value 3丢失了?我该怎么做?我使用以下代码来抓取:
for (Element row : parse.select("ul>li>a>span")){ //to scrape the first one
String ing = row.getAllElements().text();
ingDebug1.add(ing);
debug = i;
}
for (Element row :parse.select("ul>li>span")){ //to scrape the third one
String ing = row.getAllElements().text();
debug = i;
}
for (int k = 0; k<ingDebug1.size(); k++){ // to put them together
ingShowUp.add(ingDebug1.get(k));
ingShowUp.add(ingDebug2.get(k));
}
1条答案
按热度按时间hrysbysz1#
这里有一个解决方案,它提供了两种过滤
li
节点的方法,这样您就可以只捕获那些将span
作为其子节点之一的节点。(将线.filter(TopicAndDescriptionParser::isValidNode1)
更改为.filter(TopicAndDescriptionParser::isValidNode2)
,以证明它们产生相同的结果。)您没有说明如何从每个
li
中收集相关数据,因此我创建了记录TopicAndDescription
来封装它。输出为