Пропустить пустую ячейку после указанного слова, используя Xpath - PullRequest
0 голосов
/ 03 апреля 2020

Я использую Xpath для извлечения данных из файлов Excel. Я использую приведенный ниже код Xpath, чтобы получить значения под определенным c словом.

Код:

//tr[position() > count(//tr[contains(.,'Tariff')]/preceding-sibling::tr)+1]/td[position() = count(//tr/td[contains(.,'Tariff')]/preceding-sibling::td)+1]

Это работает, но я натолкнулся на некоторые Excels, которые добавляют пустой <td> сразу после слова «Тариф». Что на самом деле испортит конечный результат. Ниже приведена часть Excel, которая преобразуется в HTML источник, с которым я работаю.

Код:

            <tr style="height:22px;">
               <td style="padding:0 2px;text-align:center;border:1px solid #000;vertical-align:bottom;">22</td>
               <td data-cell="A22" style="border-color:#000;border-bottom:thin solid #000000;font-weight:700;vertical-align:middle;padding-left:2px;padding-right:2px;" rowspan="2">Tariff </td>
               <td data-cell="B22" style="border-color:#000;border-bottom:thin solid #000000;font-weight:700;vertical-align:middle;padding-left:2px;padding-right:2px;" rowspan="2">Description</td>
               <td data-cell="C22" style="border-color:#000;border-bottom:thin solid #000000;font-weight:700;text-align:center;vertical-align:middle;padding-left:2px;padding-right:2px;" rowspan="2">Country of origin</td>
               <td data-cell="D22" style="border-color:#000;border-bottom:thin solid #000000;font-weight:700;text-align:center;vertical-align:middle;padding-left:2px;padding-right:2px;" rowspan="2">Quantity</td>
               <td data-cell="E22" style="border-color:#000;border-bottom:thin solid #000000;font-weight:700;text-align:center;vertical-align:middle;padding-left:2px;padding-right:2px;" rowspan="2">Amount DKK</td>
               <td data-cell="F22" style="mso-number-format:'0';border-color:#000;border-bottom:thin solid #000000;font-weight:700;text-align:center;vertical-align:middle;padding-left:2px;padding-right:2px;" rowspan="2">Net weight kg</td>
               <td data-cell="G22" style="border-color:#000;font-size:13px;padding-left:2px;padding-right:2px;"></td>
            </tr>
            <tr style="height:26px;">
               <td style="padding:0 2px;text-align:center;border:1px solid #000;vertical-align:bottom;">23</td>
               <td data-cell="G23" style="border-color:#000;font-size:13px;padding-left:2px;padding-right:2px;"></td>
            </tr>
            <tr style="height:20px;">
               <td style="padding:0 2px;text-align:center;border:1px solid #000;vertical-align:bottom;">24</td>
               <td data-cell="A24" style="border-color:#000;border-top:thin solid #000000;padding-left:2px;padding-right:2px;">42022290</td>
               <td data-cell="B24" style="border-color:#000;border-top:thin solid #000000;vertical-align:middle;padding-left:2px;padding-right:2px;">BAG</td>
               <td data-cell="C24" style="border-color:#000;border-top:thin solid #000000;text-align:center;vertical-align:middle;padding-left:2px;padding-right:2px;">CN</td>
               <td data-cell="D24" style="border-color:#000;border-top:thin solid #000000;text-align:center;vertical-align:middle;padding-left:2px;padding-right:2px;">2</td>
               <td data-cell="E24" style="mso-number-format:'#,##0.00';border-color:#000;border-top:thin solid #000000;text-align:center;vertical-align:middle;padding-left:2px;padding-right:2px;">147,06</td>
               <td data-cell="F24" style="mso-number-format:'0.000';border-color:#000;border-top:thin solid #000000;text-align:center;vertical-align:middle;padding-left:2px;padding-right:2px;">0,558</td>
               <td data-cell="G24" style="border-color:#000;font-size:13px;padding-left:2px;padding-right:2px;"></td>
            </tr>
            <tr style="height:20px;">
               <td style="padding:0 2px;text-align:center;border:1px solid #000;vertical-align:bottom;">25</td>
               <td data-cell="A25" style="border-color:#000;padding-left:2px;padding-right:2px;">61043900</td>
               <td data-cell="B25" style="border-color:#000;vertical-align:middle;padding-left:2px;padding-right:2px;">JACKET</td>
               <td data-cell="C25" style="border-color:#000;text-align:center;vertical-align:middle;padding-left:2px;padding-right:2px;">CN</td>
               <td data-cell="D25" style="border-color:#000;text-align:center;vertical-align:middle;padding-left:2px;padding-right:2px;">1</td>
               <td data-cell="E25" style="mso-number-format:'#,##0.00';border-color:#000;text-align:center;vertical-align:middle;padding-left:2px;padding-right:2px;">146,14</td>
               <td data-cell="F25" style="mso-number-format:'0.000';border-color:#000;text-align:center;vertical-align:middle;padding-left:2px;padding-right:2px;">0,364</td>
               <td data-cell="G25" style="border-color:#000;font-size:13px;padding-left:2px;padding-right:2px;"></td>
            </tr>

<tr> Я хочу пропустить это,

Код:

            <tr style="height:26px;">
               <td style="padding:0 2px;text-align:center;border:1px solid #000;vertical-align:bottom;">23</td>
               <td data-cell="G23" style="border-color:#000;font-size:13px;padding-left:2px;padding-right:2px;"></td>
            </tr>

Я пытался использовать //tr[contains(.,'Tariff') and (text()!='')]/preceding-sibling::tr)+1, и я пытался not(contains(.,'')), но это также не сработало. Может кто-нибудь помочь мне понять это.

1 Ответ

1 голос
/ 03 апреля 2020

Ваш XPath немного сложен. Вы хотите получить значение под указанным c словом "Traffi c". Если вы действительно хотите сохранить свой XPath, добавьте в его конец условие:

//tr[position() > count(//tr[contains(.,'Tariff')]/preceding-sibling::tr)+1]/td[position() = count(//tr/td[contains(.,'Tariff')]/preceding-sibling::td)+1][contains(@data-cell,"A")]

Но более короткий XPath также работает:

//td[contains(.,"Tariff")]/following::td[contains(@data-cell,"A")]

Если вам нужно что-то без указания имя столбца («A» для Traffi c), затем используйте:

//td[contains(.,"Tariff")]/following::td[contains(@data-cell,substring(//td[contains(.,"Tariff")]/@data-cell,1,1))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...