Я использую простой 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