I have html code like below
<html>
<body>
<div id="1">
<table>
<tr>
<td>ID</td>
<td>:</td>
<td>123</td>
</tr>
<tr>
<td>Status</td>
<td>:</td>
<td>Fail</td>
</tr>
</table>
</div>
<div id="2">
<table>
<tr>
<td>ID</td>
<td>:</td>
<td>456</td>
</tr>
<tr>
<td>Status</td>
<td>:</td>
<td>Success</td>
</tr>
</table>
</div>
<div id="3">
<table>
<tr>
<td>ID</td>
<td>:</td>
<td>789</td>
</tr>
<tr>
<td>Status</td>
<td>:</td>
<td>Fail</td>
</tr>
</table>
</div>
<div id="4">
<table>
<tr>
<td>ID</td>
<td>:</td>
<td>135</td>
</tr>
<tr>
<td>Status</td>
<td>:</td>
<td>Success</td>
</tr>
</table>
</div>
</body>
</html>
我需要解析此HTML代码。我需要遍历当前所有div标签,并在每个div中的td中迭代搜索“搜索”。如果存在,则获得其第二邻接td值,即失败/成功。如果If为“失败”,则需要再次搜索“ ID”,如果存在,则需要打印其第二个相邻的div值,在这种情况下为123和789。
伪代码可能如下所示
if(code contains "Status")
{
1. Get its 2nd td value i.e., Fail/Success
if(td value is "Fail")
{
1. Search for "ID"
if("ID" present)
{
Print the number/2nd adjacent <td> value
}
}
}
我曾经在javascript中尝试过以下操作
var t0=$(this).find('tr:has(td:contains("Test Status"))');
if (t0.length)
{
var str0 =t0.text().trim();
str0 = /:(.+)/.exec(str0)[1];
if(str0 == "FAIL")
{
var t1=$(this).find('tr:has(td:contains("Test ID"))');
if (t1.length)
{
str =t1.text().trim();
str = /:(.+)/.exec(str)[1];
testIDArray.push(str);
// alert(str);
}
}
但是我需要使用jsoup在Java中进行操作。我尝试了如下的方式
String htmlString = fileContent;
Document document = Jsoup.parse(htmlString);
Elements elements = document.body().select("div"); for (Element element : elements) { String link = element.select("td:contains(Test Status)").attr("<tr>");
if(link != null || !(link.isEmpty()))
{
System.out.println(link);
System.out.println("=========================");
}
}
请帮助我。我不知道该怎么办。
谢谢。
请帮助我。
答案 0 :(得分:0)
您可以使用Java Streams解决此问题:
List<String> failedIds = document.body().select("div table").stream()
.map(e -> e.select("tr"))
.filter(trs -> "FAIL".equalsIgnoreCase(trs.last().select("td").last().text()))
.map(trs -> trs.first().select("td").last().text())
.collect(Collectors.toList());
结果将是:
[123, 789]
首先,您选择div table
以获取所有元素。然后,选择所有tr
并过滤状态为Fail
(trs -> trs.first().select("td").last().text()
)的trs -> trs.first().select("td").last().text()
。最后,您映射ID(.forEach()
)。
要打印ID而不是创建列表,可以使用document.body().select("div table").stream()
.map(e -> e.select("tr"))
.filter(trs -> "FAIL".equalsIgnoreCase(trs.last().select("td").last().text()))
.map(trs -> trs.first().select("td").last().text())
.forEach(System.out::println);
:
for (Element e : document.body().select("div table")) {
Elements trs = e.select("tr");
if ("FAIL".equalsIgnoreCase(trs.last().select("td").last().text())) {
String id = trs.first().select("td").last().text();
System.out.println(id);
}
}
或者,您可以使用此功能(不使用流):
curl -v -X POST -d MAX_FILE_SIZE=10485760 -d 'url=https://i.imgur.com/Imox74B.gifv' http://karmadecay.com/index/