Найдите конкретную строку в <td>HTML-кода и, если она есть, выведите следующую <td>vaule, используя JSOUP - PullRequest
1 голос
/ 13 июня 2019
 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 итеративно. Если присутствует, получите его 2-е смежное значение td, т.е. Fail / Success. если If - «Fail», тогда мне нужно снова искать «ID», и если он присутствует, мне нужно напечатать его 2-е смежное значение 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("=========================");
                 }
            }

Пожалуйста, помогите мне с этим. Я не знаю, как поступить.

Заранее спасибо.

Пожалуйста, помогите мне с этим.

1 Ответ

0 голосов
/ 13 июня 2019

Вы можете использовать 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()).

Чтобы распечатать идентификаторы вместо создания списка, вы можете использовать .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);
    }
}
...