2016-06-02 1 views
1

У меня есть некоторые HTML, как:Получение списка на основе текста LXML

... 
    <table width="100%"> 
      <tr class="blueborder"> 
       <td colspan="2" class="blackbold">Some Other Text</td> 
      </tr> 
      </table> 
      <table width="100%">  
     <tr class="upcoming"> 
      <td class="lists" > 
      <ul> 
       <li> List1 Element1</li> 
       <li> List1 Element2</li> 
       <li> List1 Element3</li> 
      </ul> 
      </td> 
     </tr> 
    </table> 
     <table width="100%"> 
     <tr class="blueborder"> 
      <td colspan="2" class="blackbold">Signaling Text</td> 
     </tr> 
     </table> 
     <table width="100%"> 
     <tr class="upcoming"> 
      <td class="lists" > 
      <ul> 
       <li> List2 Element1</li> 
       <li> List2 Element2</li> 
       <li> List2 Element3</li> 
      </ul> 
      </td> 
     </tr> 
    </table> 
... 

Я использовал employees = root.xpath('.//td[@class = "lists"]/ul/li/text()'), но это захватывает оба элементы списка. Я просто хотел бы захватить списки 2, за исключением того, что они имеют одинаковые свойства (класс и т. Д.). Единственное отличие - <td colspan="2" class="blackbold">Signaling Text</td> подходит к списку, который я хочу. Есть ли способ указать, чтобы получить этот список только после этого?

ответ

0

Вы можете выбрать следующий тд после тра с текстом Signaling Text:

h = """ <table width="100%"> 
      <tr class="blueborder"> 
       <td colspan="2" class="blackbold">Some Other Text</td> 
      </tr> 
      </table> 
      <table width="100%"> 
     <tr class="upcoming"> 
      <td class="lists" > 
      <ul> 
       <li> List1 Element1</li> 
       <li> List1 Element2</li> 
       <li> List1 Element3</li> 
      </ul> 
      </td> 
     </tr> 
    </table> 
     <table width="100%"> 
     <tr class="blueborder"> 
      <td colspan="2" class="blackbold">Signaling Text</td> 
     </tr> 
     </table> 
     <table width="100%"> 
     <tr class="upcoming"> 
      <td class="lists" > 
      <ul> 
       <li> List2 Element1</li> 
       <li> List2 Element2</li> 
       <li> List2 Element3</li> 
      </ul> 
      </td> 
     </tr> 
    </table> """ 

from lxml import html 
tree = html.fromstring(h) 
print(tree.xpath('//td[contains(.,"Signaling Text")]/following::td[@class = "lists"]/ul/li/text()')) 

Который даст вам:

[' List2 Element1', ' List2 Element2', ' List2 Element3'] 

Или, если вы были уверены, что это было второе появление:

tree.xpath('(//td[@class = "lists"])[2]/ul/li/text()') 
+0

Я знал, что должно быть какое-то простое решение. Благодаря! – sundorer

+0

Нет, пожалуйста. –