Я использую простой HTMLParser для анализа веб-страницы с кодом, который всегда хорошо сформирован (он автоматически генерируется). Он работает хорошо, пока он не попадет в кусок данных с надписью «&» - кажется, что это делает его двумя отдельными фрагментами данных и обрабатывает их отдельно. (То есть, он дважды вызывает «handle_data».) Я сначала подумал, что снятие «&» решит проблему, но я не думаю, что это так. Есть ли у кого-нибудь предложения о том, как я могу заставить мой парсер лечить, например, «Paradise Bakery and Cafe» (то есть «Paradise Bakery & Café») как единый элемент данных, а не как два?Python HTMLParser, делящий данные на &
Спасибо большое, BSG
P.S. Пожалуйста, не говорите мне, что я действительно должен использовать 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
Я добавил свой код - большое вам спасибо за ваше предложение! – bsg
Добавлено мои изменения в ваш код. – kindall
Он работал красиво - большое вам спасибо! И спасибо за очистку моего кода - верьте или нет, мои самообученные навыки Python каким-то образом не включали правильный способ делать булевы. – bsg