Как выбрать родителя на основе ребенка в lxml? - PullRequest
5 голосов
/ 27 февраля 2012

У меня есть этот код:

<table cellspacing="1" cellpadding="1" border="0">
  <tbody>
   <tr>
    <td>Something else</td>
   </tr>
   <tr>
    <td valign="top">
      <a href="http://exact url">Something</a>
    </td>
    <td valign="top">Something else</td>
   </tr>
  </tbody>
</table>

Я хочу найти Таблицу, но на нее очень сложно ориентироваться (тот же код используется 10 раз). Но я знаю, что в URL. Как мне тогда получить родительскую таблицу?

Ответы [ 4 ]

5 голосов
/ 28 февраля 2012

Если t является etree для этого фрагмента XML, то ссылка, которую вы ищете, это

t.xpath('//a[@href = "http://exact url"]')[0]

Оттуда вы можете добраться до table по оси ancestor:

t.xpath('//a[@href = "http://exact url"]/ancestor::table')[-1]
2 голосов
/ 28 февраля 2012

Чистый раствор XPath.

Используйте

(//a[@href = "http://exact url"])[1]/ancestor::table[1]

Выбирает первого предка table первого элемента a в документе XML, строковое значение атрибута href которого представляет собой строку "http://exact url".

Это обеспечивает правильный элемент table даже в случае, когда есть вложенные таблицы , каждая из которых имеет требуемый элемент a в качестве потомка. В этом случае указанное выше выражение XPath выбирает самый внутренний такой table - в отличие от принятого в настоящее время ответа, который получает самый внешний table предок.

2 голосов
/ 28 февраля 2012

Фильтрация таблиц с помощью []. Обратите внимание, что атрибут внука //table[.//@href="blah"]

или //a[@href="blah"]//ancestor::table

1 голос
/ 28 февраля 2012

//a[@href="http://exact url"]/../../..

Вам понадобится 3 .. с, чтобы добраться до элемента таблицы.

...