【问题标题】:Search for particular string in <td> of html code and if present print next <td> vaule using JSOUP在 html 代码的 <td> 中搜索特定字符串,如果存在则使用 JSOUP 打印下一个 <td> 值
【发布时间】:2019-10-27 17:28:26
【问题描述】:
 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 值,即失败/成功。如果如果是“失败”,那么我需要再次搜索“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);
                } 
           }

但我需要在 java 中使用 jsoup 来完成。我尝试了类似下面的方法

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

请帮我解决这个问题。我不知道如何继续。

提前致谢。

请帮我解决这个问题。

【问题讨论】:

    标签: java jsoup html-parsing


    【解决方案1】:

    您可以使用 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 以获取所有元素。然后选择所有trs 并过滤状态为Fail (trs -&gt; trs.first().select("td").last().text()) 的那些。最后映射 ID (trs -&gt; trs.first().select("td").last().text())。

    要打印 ID 而不是创建列表,您可以使用 .forEach()

    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);
        }
    }
    

    【讨论】:

    • 嗨@Samuel Philipp 感谢您的回复。我使用 Java 流尝试了您的代码,它打印了空列表。第二个 sn-p 没有打印任何东西。
    • 嗨@Samuel Philipp 我正在从一个html文件加载html内容并存储在一个变量中。请参阅我的问题中的伪代码。我已经更新了它。我尝试用“失败”替换“状态”没有工作。请帮助
    • List failedIds = document.body().select("div table").stream() .map(e -> e.select("tr")) .filter(trs -> "测试状态".equalsIgnoreCase(trs.last().select("td").last().text())) .map(trs -> trs.first().select("td")。 last().text()) .collect(Collectors.toList()); System.out.println(failedIds);打印 []
    • 您应该使用Fail,因为这是最后一个td 中的值。还请验证您正在解析的 html 字符串。我昨天对其进行了测试,它与您共享的 HTML 完美配合。
    • 像魅力一样工作。谢谢@Samuel Philipp
    猜你喜欢
    • 1970-01-01
    • 2019-10-13
    • 2012-11-04
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    相关资源
    最近更新 更多