在html代码的<td>中搜索特定字符串,如果存在,则使用JSOUP打印下一个<td>值

时间:2019-06-13 07:07:26

标签: java jsoup html-parsing

 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("=========================");
                 }
            }

请帮助我。我不知道该怎么办。

谢谢。

请帮助我。

1 个答案:

答案 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并过滤状态为Failtrs -> 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/