Нужна помощь по синтаксису Python lxml для анализа HTML

StackOverflow https://stackoverflow.com/questions/603287

  •  03-07-2019
  •  | 
  •  

Вопрос

Я новичок в 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?

Это было полезно?

Решение

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

Однако лично я предпочитаю книгу Яна Бикинга. HTML-парсер, включенный в 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'))

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top