Найти - Пользователи
Полная версия: Парсинг HTML, хоть какой-нибудь пример?
Начало » Python для экспертов » Парсинг HTML, хоть какой-нибудь пример?
1
Все ники заняты
Нигде не могу найти хоть самого простого примера работы с модулем HTMLParser. Задача проста: найти в HTML-коде все теги div, у которых атрибут class равен ‘error’, и вывести их текст.
import HTMLParser
p = HTMLParser.HTMLParser()
p.feed(htmlText)
p.handle_starttag('div', ['class', 'error'])
Что надо делать дальше?
Александр Кошелев
Все ники заняты
А стандартную документацию читал? Там же пример есть. Надо отнаследоваться от HTMLParser, и реализовать самому handle_starttag. В нем проверять tag на “div” и нужный тебе атрибут.
Все ники заняты
Там пример из нескольких строк, который вообще ничего не проясняет.
Я решил проблему с помощью красивого супа.
P.S. Вручную вставлять теги на форуме - это специально, из соображений мазохизма сделано? Ведь оригинальный движок PunBB содержит кнопки для вставки тегов.
shiza
Давай-те я лучше расскажу как это делать с моделем BeautifulSoup. Он удобнее и может работать с реальными (и битыми ) html, а не иделаьнымии конями в вакууме.

и так:
————————–
from BeautifulSoup import BeautifulSoup #подключаем суп =)
soup = BeautifulSoup(htmlText) #загружаем html в суп =)
divs = soup.findAll(name = ‘div’, attrs = {'class':'error'}) #ищем дивы
for div in divs:
print “”.join(div.findAll(text = True)) #выводим весь текст из divа
————————–
Александр Кошелев
Все ники заняты
Там пример из нескольких строк, который вообще ничего не проясняет.
кому надо, тот поймет. плюс в референсе написано как пользоваться.
slav0nic
Все ники заняты


from HTMLParser import HTMLParser
class myparser(HTMLParser):

def __init__(self):
HTMLParser.__init__(self)
self.count = 0


def handle_starttag(self, tag ,attrs):
if tag == “div” and “error” in attrs:
print attrs
self.count = self.count+1
data = “”“
<div class=”error“>123</div>
<div class=”error“>123</div>
<div class=”error“>123</div>
<div class=”noerror“>123</div>
”“”
pars = myparser()
pars.feed(data)
print pars.count

Psixo
Кстати, перед тем как заюзать HTMLParser рекомендую прогнать текст через суп

soup = BeautifulSoup(text)
soup.prettify()

Зы, в книге Россума которая на русском есть описание HTMLParser. Оно немного устарело, но суть понять будет легко,там всё достаточно просто. (Книгу вроде выкладывали на форуме.)
Все ники заняты
Спасибо за ответы!
Psixo
Кстати, перед тем как заюзать HTMLParser рекомендую прогнать текст через суп
Я так понял для себя, что реализовывать свой класс через HTMLParser просто ни к чему, если есть суп :). Тем более, если “перед тем как заюзать HTMLParser рекомендую прогнать текст”, т.е. без супа всё равно ни куда, получается.
shiza
суп рулит однозначно конечно.
Но не всегда может корректно исправить совсем уж корявые html ( в одном случае из 200 наверное).
Наиболее похоже на то, как это делаем броузер - работает mxTidy.
http://www.egenix.com/products/python/mxExperimental/mxTidy/
Psixo
Все ники заняты, в принципе так и есть =) Хотя меня можете считать извращенцем, но суп я юзаю только чтобы выровнять хтмл. Остальное делаю через HTMLParser
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB