Нужна помощь синтаксиса Python lxml для разбора HTML - PullRequest
16 голосов
/ 02 марта 2009

Я новичок в python, и мне нужна помощь с синтаксисом для поиска и повторения HTML-тегов с использованием lxml. Вот примеры использования, с которыми я имею дело:

HTML-файл довольно хорошо сформирован (но не идеален). Имеет несколько таблиц на экране, одна из которых содержит набор результатов поиска, и по одной для верхнего и нижнего колонтитула. Каждая строка результатов содержит ссылку на детали результатов поиска.

  1. Мне нужно найти среднюю таблицу со строками результатов поиска (эту я смог выяснить):

        self.mySearchTables = self.mySearchTree.findall(".//table")
        self.myResultRows = self.mySearchTables[1].findall(".//tr")
    
  2. Мне нужно найти ссылки, содержащиеся в этой таблице (вот где я застреваю):

        for searchRow in self.myResultRows:
            searchLink = patentRow.findall(".//a")
    

    Кажется, он не находит элементы ссылки.

  3. Мне нужен простой текст ссылки. Я полагаю, что было бы что-то вроде searchLink.text, если бы я вообще получил элементы ссылки.

Наконец, в фактической справке по API для lxml я не смог найти информацию о вызовах find и findall. Я почерпнул их из фрагментов кода, которые нашел в Google. Я что-то упускаю из-за того, как эффективно найти и перебрать теги HTML с помощью lxml?

Ответы [ 2 ]

27 голосов
/ 02 марта 2009

Хорошо, во-первых, в отношении анализа HTML: если вы следуете рекомендациям zweiterlinde и S.Lott, по крайней мере, используйте версию beautifulsoup, включенную в lxml . Таким образом, вы также сможете воспользоваться хорошим интерфейсом селектора xpath или css.

Однако я лично предпочитаю HTML-анализатор Ian Bicking, включенный в lxml .

Во-вторых, .find() и .findall() происходят из lxml, пытающегося быть совместимым с ElementTree, и эти два метода описаны в Поддержка XPath в ElementTree .

Эти две функции довольно просты в использовании, но они очень ограничены XPath. Я рекомендую использовать полный метод lxml xpath() или, если вы уже знакомы с CSS, использовать метод cssselect() .

Вот несколько примеров, когда HTML-строка анализируется следующим образом:

from lxml.html import fromstring
mySearchTree = fromstring(your_input_string)

Используя класс селектора css, ваша программа будет выглядеть примерно так:

# Find all 'a' elements inside 'tr' table rows with css selector
for a in mySearchTree.cssselect('tr a'):
    print 'found "%s" link to href "%s"' % (a.text, a.get('href'))

Эквивалент с использованием метода xpath будет:

# Find all 'a' elements inside 'tr' table rows with xpath
for a in mySearchTree.xpath('.//tr/*/a'):
    print 'found "%s" link to href "%s"' % (a.text, a.get('href'))
5 голосов
/ 02 марта 2009

Есть ли причина, по которой вы не используете Beautiful Soup для этого проекта? Это значительно облегчит работу с несовершенно оформленными документами.

...