Нужна помощь по синтаксису Python lxml для анализа HTML
-
03-07-2019 - |
Вопрос
Я новичок в Python, и мне нужна помощь с синтаксисом для поиска и перебора тегов HTML с помощью lxml.Вот случаи использования, с которыми я имею дело:
HTML-файл довольно хорошо сформирован (но не идеален).Имеет несколько таблиц на экране, одна из которых содержит набор результатов поиска, а другая — для верхнего и нижнего колонтитула.Каждая строка результатов содержит ссылку на подробные сведения о результатах поиска.
Мне нужно найти среднюю таблицу со строками результатов поиска (это мне удалось выяснить):
self.mySearchTables = self.mySearchTree.findall(".//table") self.myResultRows = self.mySearchTables[1].findall(".//tr")
Мне нужно найти ссылки, содержащиеся в этой таблице (вот тут я и застреваю):
for searchRow in self.myResultRows: searchLink = patentRow.findall(".//a")
Кажется, на самом деле он не находит элементы ссылки.
Мне нужен простой текст ссылки.Я думаю, это будет что-то вроде
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'))
Другие советы
Есть ли причина, по которой вы не используете Красивый суп для этого проекта?Это значительно облегчит работу с несовершенно оформленными документами.