Все ники заняты
Ноя. 18, 2007 15:32:32
Нигде не могу найти хоть самого простого примера работы с модулем HTMLParser. Задача проста: найти в HTML-коде все теги div, у которых атрибут class равен ‘error’, и вывести их текст.
import HTMLParser
p = HTMLParser.HTMLParser()
p.feed(htmlText)
p.handle_starttag('div', ['class', 'error'])
Что надо делать дальше?
Александр Кошелев
Ноя. 18, 2007 17:45:58
Все ники заняты
А стандартную документацию читал? Там же пример есть. Надо отнаследоваться от HTMLParser, и реализовать самому handle_starttag. В нем проверять tag на “div” и нужный тебе атрибут.
Все ники заняты
Ноя. 18, 2007 18:55:34
Там пример из нескольких строк, который вообще ничего не проясняет.
Я решил проблему с помощью
красивого супа.
P.S. Вручную вставлять теги на форуме - это специально, из соображений мазохизма сделано? Ведь оригинальный движок PunBB содержит кнопки для вставки тегов.
shiza
Ноя. 18, 2007 19:04:16
Давай-те я лучше расскажу как это делать с моделем 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а
————————–
Александр Кошелев
Ноя. 18, 2007 19:04:45
Все ники заняты
Там пример из нескольких строк, который вообще ничего не проясняет.
кому надо, тот поймет. плюс в референсе написано как пользоваться.
slav0nic
Ноя. 19, 2007 14:17:07
Все ники заняты
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
Ноя. 19, 2007 18:36:42
Кстати, перед тем как заюзать HTMLParser рекомендую прогнать текст через суп
soup = BeautifulSoup(text)
soup.prettify()
Зы, в книге Россума которая на русском есть описание HTMLParser. Оно немного устарело, но суть понять будет легко,там всё достаточно просто. (Книгу вроде выкладывали на форуме.)
Все ники заняты
Ноя. 19, 2007 20:33:54
Спасибо за ответы!
Psixo
Кстати, перед тем как заюзать HTMLParser рекомендую прогнать текст через суп
Я так понял для себя, что реализовывать свой класс через HTMLParser просто ни к чему, если есть суп :). Тем более, если “перед тем как заюзать HTMLParser рекомендую прогнать текст”, т.е. без супа всё равно ни куда, получается.
shiza
Ноя. 19, 2007 21:56:03
суп рулит однозначно конечно.
Но не всегда может корректно исправить совсем уж корявые html ( в одном случае из 200 наверное).
Наиболее похоже на то, как это делаем броузер - работает mxTidy.
http://www.egenix.com/products/python/mxExperimental/mxTidy/
Psixo
Ноя. 21, 2007 16:42:50
Все ники заняты, в принципе так и есть =) Хотя меня можете считать извращенцем, но суп я юзаю только чтобы выровнять хтмл. Остальное делаю через HTMLParser