2016-07-09 8 views
1

У меня возникает проблема при попытке получить родительский узел элемента tr во время итерации через все их.Python lxml, итерация через tr элементов

Вот базовая таблица, с которой я работаю.

<table border=1> 
    <tbody> 
    <tr> 
    <td> 
    <p>Some text</p> 
    </td> 
    <td> 
    <p>Some more text</p> 
    </td> 
    </tr> 
    <tr> 
    <td> 
    <p> Some more text</p> 
    </td> 
    <td> 
    <p> Some more text</p> 
    </td> 
    </tr> 
    <tr> 
    <td> 
    <p> Some more text</p> 
    </td> 
    <td> 
    <p> Some more text</p> 
    </td> 
    </tr> 
    </tbody> 
    </table> 

А вот мой Python скрипт, чтобы получить родительский узел, используя LXML

import lxml.html 

htm = lxml.html.parse('plaintable.htm') 
tr = htm.xpath('//tr') 
for x in tr: 
    tbody = tr.getparent() 
    if tbody.index(tr) == 1: 
     print ('Success!') 
print ('Finished') 

Я получаю эту ошибку, когда я бегу сценарий: AttributeError: «список» объект не имеет атрибута «GetParent '

Я довольно новичок в Python, так что это может быть что-то простое. Я испортил. Я прочитал документы lxml и не нашел ответа.

Любая помощь будет замечательной!

ответ

1

tr - это фактически список матчей xpath. x соответствует индивидуальным tr элементов - вызов getparent() метод на нем вместо:

tr = htm.xpath('//tr') 
for x in tr: 
    tbody = x.getparent() 
    # ... 

Хотя, я не вижу особого смысла в том, чтобы один и тот же родитель снова и снова в цикле, в случае, если у вас есть один table и tbody элемент. Почему не найти его заранее:

tbody = htm.xpath("//tbody")[0] 
for x in tbody.xpath(".//tr"): 
    # ... 

I need to find the first tr in every table to build it properly

Как для этого - я бы перебрать все элементы table и найти первый элемент tr:

tables = htm.xpath("//table") 
for table in tables: 
    first_tr = table.xpath(".//tr")[0] 
+0

Ах идеальный! Я не понял, как назвать индекс в цикле for. Я привык к JavaScript, поэтому было непросто. В двух словах, я строю XML-файл на основе таблиц в документе HTML. В настоящее время я работаю с 36 различными таблицами. Мне нужно найти первый tr в каждой таблице, чтобы правильно его построить. – Chad

+0

@ Получил его, также обновленный с образцом кода для «Мне нужно найти первую tr в каждой таблице, чтобы построить ее правильно». Благодаря! – alecxe

+0

Удивительно, что это будет чрезвычайно полезно при создании родительских узлов. Я очень ценю вашу помощь! – Chad