Python HTMLParser, разделяющий данные на &

Я использую простой HTMLParser для разбора веб-страницы с кодом, который всегда имеет правильный формат (он автоматически генерируется). Он работает хорошо, пока не наткнется на фрагмент данных со знаком «&» — похоже, он думает, что это делает его двумя отдельными фрагментами данных и обрабатывает их отдельно. (То есть он вызывает "handle_data" дважды.) Сначала я думал, что устранение экранирования '&' решит проблему, но я так не думаю.Есть ли у кого-нибудь какие-либо предложения о том, как я могу заставить свой парсер обрабатывать, например, «Райская пекарня и кафе» (то есть «Райская пекарня и кафе») как один элемент данных, а не как два?

Большое спасибо, бсг

П.С. Пожалуйста, не говорите мне, что я действительно должен использовать BeautifulSoup. Я знаю. Но в этом случае я знал, что разметка всегда будет правильно сформирована, и я обнаружил, что с HTMLParser работать проще, чем с BeautifulSoup. Спасибо.

Добавляю свой код - спасибо!

#this class, extending HTMLParser, is written to process HTML within a <ul>. 
#There are 6 <a> elements nested within each <li>, and I need the data from the second 
#one. Whenever it encounters an <li> tag, it sets the 'is_li' flag to true and resets 
#the count of a's seen to 0; whenever it encounters an <a> tag, it increments the count
#by 1.   When handle_data is called, it checks to make sure that the data is within
#1)an li element and 2) an a element, and that the a element is the second one in that
#li (num_as == 2). If so, it adds the data to the list. 

class MyHTMLParser(HTMLParser):
pages = []
is_li = 'false'
#is_li 
num_as = 0

def _init_(self):
    HTMLParser._init_(self)
    self.pages = []
    self.is_li = 'false'
    self.num_as = 0
    self.close_a = 'false'
    sel.close_li = 'false'
    print "initialized"


def handle_starttag(self, tag, attrs):
      if tag == 'li':
          self.is_li = 'true'
          self.close_a = 'false'
          self.close_li = 'false'


      if tag == 'a' and self.is_li == 'true':
          if self.num_as < 7:
              self.num_as += 1
              self.close_a = 'false'

          else:
              self.num_as = 0
              self.is_li = 'false'

def handle_endtag(self, tag):
     if tag == 'a':
         self.close_a = 'true'

     if tag == 'li':
         self.close_li = 'true'
         self.num_as = 0

def handle_data(self, data):
    if self.is_li == 'true':
        if self.num_as == 2 and self.close_li == 'false' and self.close_a == 'false':
            print "found data",  data
            self.pages.append(data)

def get_pages(self):
    return self.pages
6
задан bsg 14 March 2012 в 22:23
поделиться