Нужна помощь синтаксиса python lxml для разбора html
Я новичок в 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?
Ответы
Ответ 1
Хорошо, во-первых, в отношении разбора HTML: если вы следуете рекомендациям zweiterlinde и S.Lott, по крайней мере, используйте версию beautifulsoup, включенную в LXML. Таким образом, вы также воспользуетесь преимуществами селекторного интерфейса xpath или css.
Однако я лично предпочитаю Ian Bicking 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'))
Ответ 2
Есть ли причина, по которой вы не используете Beautiful Soup для этого проекта? Это значительно упростит работу с документами с несовершенной формой.