Сегодня я попробовал lxml, так как получил очень неприятный вывод html от определенного веб-сервиса, и я не хотел идти с модулем re, просто для изменений и для изучения чего-то нового. И я сделал, просматривая http://codespeak.net/lxml/ и http://stackoverflow.com параллельно
Я не буду пытаться объяснить выше HTML шаблон, но просто для обзора, он полон намеренно вложенных таблиц.
Я извлек часть интереса с помощью html-парсера, затем find_class () и перебрал TR с помощью xpath (и даже у этих TR есть таблицы внутри).
Сейчас я пытаюсь извлечь пары данных на основе атрибутов class и id:
- name child имеет класс "title"
- значение child имеет идентификатор "text"
Код выглядит примерно так:
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, который я повторяю, имеет эти пары: некоторые имеют только имя (id "title"), поэтому позже, когда я пытаюсь сжать их, я получаю неправильно спаренные данные.
Я попробовал пару вещей, которые пришли мне в голову, но ничего не получилось: я попытался сравнить длину списка (по имени и значению) и, если они не совпадают, пропустить поиск по имени, тогда, если они не совпадают, удалить последнюю элемент списка (во многих отношениях), но ничего не получалось. Например:
if not len(name) == len(value):
name.pop()
или
if len(name) == len(value):
name = node.xpath('//div[@id="title"]')
value = node.xpath('//td[@class="text"]')
Некоторые комментарии от более опытных?