2009-03-02 4 views
16

Я совершенно новый для python, и мне нужна помощь в синтаксисе поиска и итерации через теги html с помощью lxml. Вот варианты использования, которыми я занимаюсь:Нужна помощь синтаксиса python lxml для разбора html

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?

ответ

27

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

Однако я лично предпочитаю Ian Bicking's HTML parser included in lxml.

Во-вторых, .find() и .findall() приходят из LXML пытается быть совместимы с ElementTree, и эти два метода описаны в XPath Support in ElementTree.

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

Вот несколько примеров, с 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')) 
+0

Yay! Только то, что мне было нужно. Я интерпретировал cssselect, чтобы на самом деле требовать, чтобы элементы имели объявленный класс css. Вложенная логика поиска - это то, что мне нужно! Спасибо, Ван Гейл! –

+0

Эта страница рекомендует использовать iterchildren и iterdescendants с опцией тега. http://www.ibm.com/developerworks/xml/library/x-hiperfparse/#N10239 – endolith

+1

Отличный ответ, но как незначительный каламбур - почему '.// tr/*/a', а не' .// тр // a'? Первый не смог бы найти что-либо с дополнительным промежуточным тегом, т. Е. '..' –

5

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

+0

+1: lxml для xml. Красивый суп для HTML. –

+2

Я начал с Beautiful Soup, но мне не повезло. Я упомянул в своем вопросе, что мой документ довольно хорошо сформирован, но ему не хватает конечного блока тела.Он просто отбрасывает весь контент, когда я втягиваю его в парсер. Следовательно, lxml. Кроме того, http://tinyurl.com/37u9gu указал лучше mem mgmt с lxml –

+7

Сначала использовал BeautifulSoup, но он не обрабатывает плохой HTML, а также утверждает. Он также не поддерживает элементы с несколькими классами и т. Д. Lxml.html лучше для всего, что я сделал с ним. – endolith

Смежные вопросы