Разбор HTML с Lxml - PullRequest
       10

Разбор HTML с Lxml

14 голосов
/ 25 августа 2010

Мне нужна помощь в разборе текста со страницы с помощью lxml. Я попробовал BeautifulSoup, и HTML-код страницы, которую я анализирую, настолько сломан, что не сработает. Поэтому я перешел к lxml, но документы немного сбивают с толку, и я надеялся, что кто-то здесь сможет мне помочь.

Здесь - страница, которую я пытаюсь проанализировать, мне нужно получить текст в разделе «Дополнительная информация». Обратите внимание, что у меня на этом сайте много таких страниц, которые можно анализировать, и HTML-код каждой страницы не всегда одинаков (может содержать некоторые дополнительные пустые теги "td"). Буду очень признателен за любые предложения относительно того, как получить этот текст.

Спасибо за помощь.

1 Ответ

15 голосов
/ 25 августа 2010
import lxml.html as lh
import urllib2

def text_tail(node):
    yield node.text
    yield node.tail

url='http://bit.ly/bf1T12'
doc=lh.parse(urllib2.urlopen(url))
for elt in doc.iter('td'):
    text=elt.text_content()
    if text.startswith('Additional  Info'):
        blurb=[text for node in elt.itersiblings('td')
               for subnode in node.iter()
               for text in text_tail(subnode) if text and text!=u'\xa0']
        break
print('\n'.join(blurb))

урожайность

Уже более 65 лет компания Carl Stirn's Marine устанавливает новые стандарты качества и сервиса для удовольствия на лодке.Поскольку мы предлагаем качественные товары, заботу, добросовестность, продажи и обслуживание, мы смогли сделать наших клиентов нашими хорошими друзьями.

Наше предприятие площадью 26 000 кв. Футов включает в себя отдел комплектующих и аксессуаров, отдел полного обслуживания(Merc. Premier дилер с 2 штатными Mercruiser Master Tech's), а также новые, подержанные и брокерские продажи.

Редактировать: Вот альтернативное решение, основанное на Стивене Д.Xpath Маевского, в котором рассматривается комментарий ОП о том, что количество тегов, отделяющих «дополнительную информацию» от объявления, может быть неизвестно:

import lxml.html as lh
import urllib2

url='http://bit.ly/bf1T12'
doc=lh.parse(urllib2.urlopen(url))

blurb=doc.xpath('//td[child::*[text()="Additional  Info"]]/following-sibling::td/text()')

blurb=[text for text in blurb if text != u'\xa0']
print('\n'.join(blurb))
...