Сегодня я попробовал lxml, так как получил очень неприятный html-вывод из определенного веб-сервиса, и я не хотел использовать модуль re, просто для изменений и изучения чего-то нового. И я это сделал, просматривая http://codespeak.net/lxml/ и http://stackoverflow.com параллельно
Я не буду пытаться объяснить приведенный выше html-шаблон, но просто для обзора он полон преднамеренно вложенных таблиц.
Я извлек интересующую часть с помощью синтаксического анализатора html, затем find_class() и повторил TR с помощью xpath (и даже в этих TR есть таблицы внутри). Теперь я пытаюсь извлечь пары данных на основе атрибутов класса и идентификатора:
- имя ребенка имеет класс "название"
- значение дочернего элемента имеет идентификатор "текст"
Код выглядит примерно так:
fragment = root.find_class('foo')
for node in fragment[0].xpath('table[2]/tr'):
name = node.xpath('//div[@id="title"]')
value = node.xpath('//td[@class="text"]')
Проблема в том, что не каждый TR, который я повторяю, имеет эти пары: некоторые только с именем (идентификатор «название»), поэтому позже, когда я пытаюсь их заархивировать, я получаю неправильно спаренные данные.
Я попробовал пару вещей, которые пришли мне в голову, но ничего не получилось: я попытался сравнить длину списка (для имени и значения), и если они не совпадают, пропустить поиск имени, а затем, если они не совпадают, удалить последний элемент списка ( разными способами) но ничего не получалось. Например:
if not len(name) == len(value):
name.pop()
or
if len(name) == len(value):
name = node.xpath('//div[@id="title"]')
value = node.xpath('//td[@class="text"]')
Некоторые комментарии от более опытных?