Как найти значение X-ячеек после совпадения с xpath и lxml - PullRequest
0 голосов
/ 05 октября 2018

У меня есть документ с несколькими строками, который имеет значение в 4-м элементе TD, и я не могу понять, как его получить.В тегах нет ничего уникального, поэтому я должен сопоставить, основываясь на слове TOTAL, а затем получить нужное мне значение из 4-го TD в существующей строке.Это один TR для иллюстрации:

<TR>
<TD ALIGN="right" COLSPAN="30" bgcolor=d8caca><div class=small4>SECTION TOTAL</div></TD>
<TD ALIGN="right" COLSPAN="8" bgcolor=d8caca> &nbsp; </TD>
<TD ALIGN="right" COLSPAN="13" bgcolor=gold><div class=small4>  11.907531</div> 
</TD>
<TD ALIGN="right" COLSPAN="13" bgcolor=gold><div class=small4>     $773.10</div></TD>
</TR>

Я хочу сопоставить слово «ВСЕГО», а затем получить значение ровно через три ячейки, или в этом случае $ 773,10.

Этоуспешно собирает каждый текст «ВСЕГО» в массив без проблем:

titles = tree.xpath("//tr/td[contains(., 'TOTAL')]//text()")

Однако я не могу получить значения в последнем элементе.Я пробовал многочисленные варианты следующего поиска ИТОГО, а затем пытался использовать следующего или следующего брата, но безрезультатно:

totals = tree.xpath("//tr/td[contains(., 'TOTAL')]/../following::td[4]/div/text()")

... но я либо получаю массив неразрушаемыхпространство от ближайшего следующего TD после ИТОГО, вообще никаких данных или ссылок на «элементы», которые при расширении до текста равны нулю.Как правильно получить значение внутри td [4] в существующем TR после сопоставления содержимого?

Я пытаюсь получить каждый случай, а не только один, чтобы массивы заголовков и итогов составляли 1: 1 совпадение.Если есть способ создать пару ключ => значение, это было бы еще лучше.

1 Ответ

0 голосов
/ 05 октября 2018

Вы можете использовать following-sibling ось для получения td, расположенного после td, содержащего текст "TOTAL" в том же родительском элементе, а затем отфильтровать результат, чтобы получить только последний из таких td с использованием предиката [last()], затем верните ребенка div/text():

query = "//tr/td[contains(., 'TOTAL')]/following-sibling::td[last()]/div/text()"
titles = tree.xpath(query)

xpathtester demo: http://www.xpathtester.com/xpath/5cf0aa473d030da66de1bec73bcb8795

...