Форум сайта python.su
Нигде не могу найти хоть самого простого примера работы с модулем 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 содержит кнопки для вставки тегов.
Офлайн
Давай-те я лучше расскажу как это делать с моделем 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а
————————–
Офлайн
Все ники занятыкому надо, тот поймет. плюс в референсе написано как пользоваться.
Там пример из нескольких строк, который вообще ничего не проясняет.
Офлайн
Все ники заняты
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
Офлайн
Кстати, перед тем как заюзать HTMLParser рекомендую прогнать текст через суп
soup = BeautifulSoup(text)
soup.prettify()
Зы, в книге Россума которая на русском есть описание HTMLParser. Оно немного устарело, но суть понять будет легко,там всё достаточно просто. (Книгу вроде выкладывали на форуме.)
Офлайн
Спасибо за ответы!
PsixoЯ так понял для себя, что реализовывать свой класс через HTMLParser просто ни к чему, если есть суп :). Тем более, если “перед тем как заюзать HTMLParser рекомендую прогнать текст”, т.е. без супа всё равно ни куда, получается.
Кстати, перед тем как заюзать HTMLParser рекомендую прогнать текст через суп
Офлайн
суп рулит однозначно конечно.
Но не всегда может корректно исправить совсем уж корявые html ( в одном случае из 200 наверное).
Наиболее похоже на то, как это делаем броузер - работает mxTidy.
http://www.egenix.com/products/python/mxExperimental/mxTidy/
Офлайн
Все ники заняты, в принципе так и есть =) Хотя меня можете считать извращенцем, но суп я юзаю только чтобы выровнять хтмл. Остальное делаю через HTMLParser
Офлайн