Intereting Posts

Как я могу использовать библиотеку HTMLParser python для извлечения данных из определенного тега div?

Я пытаюсь получить значение из HTML-страницы, используя библиотеку HTML-Python. Значение, которое я хочу получить, находится внутри этого элемента html:

... 
20
...

Это мой class HTMLParser:

 class LinksParser(HTMLParser.HTMLParser): def __init__(self): HTMLParser.HTMLParser.__init__(self) self.seen = {} def handle_starttag(self, tag, attributes): if tag != 'div': return for name, value in attributes: if name == 'id' and value == 'remository': #print value return def handle_data(self, data): print data p = LinksParser() f = urllib.urlopen("http://domain.com/somepage.html") html = f.read() p.feed(html) p.close() 

Может ли кто-нибудь указать мне в правильном направлении? Я хочу, чтобы функциональность classа получала значение 20.

 class LinksParser(HTMLParser.HTMLParser): def __init__(self): HTMLParser.HTMLParser.__init__(self) self.recording = 0 self.data = [] def handle_starttag(self, tag, attributes): if tag != 'div': return if self.recording: self.recording += 1 return for name, value in attributes: if name == 'id' and value == 'remository': break else: return self.recording = 1 def handle_endtag(self, tag): if tag == 'div' and self.recording: self.recording -= 1 def handle_data(self, data): if self.recording: self.data.append(data) 

self.recording подсчитывает количество вложенных тегов div начиная с «триггера». Когда мы находимся в поддереве, внедренном в триггерный тег, мы накапливаем данные в self.data .

Данные в конце синтаксиса остаются в self.data (список строк, возможно, пуст, если не был встречен триггерный тег). Ваш код извне classа может получить доступ к списку непосредственно из экземпляра в конце parsingа или вы можете добавить соответствующие методы доступа для этой цели, в зависимости от вашей цели.

Класс можно было бы легко сделать немного более общим, используя вместо константных литералов строки, указанные в приведенном выше коде, 'div' , 'id' и 'remository' , атрибуты экземпляра self.tag , self.attname и self.attvalue , заданный __init__ из переданных ему аргументов – я избегал этого дешевого шага обобщения в приведенном выше коде, чтобы избежать затенения основных точек (отслеживать количество вложенных тегов и накапливать данные в список при активном состоянии записи ).

Вы пробовали BeautifulSoup ?

 from bs4 import BeautifulSoup soup = BeautifulSoup('
20
') tag=soup.div print(tag.string)

Это дает вам 20 на выходе.

Небольшая коррекция в строке 3

HTMLParser.HTMLParser.__init__(self)

должен быть

HTMLParser.__init__(self)

Следующие работали для меня, хотя

 import urllib2 from HTMLParser import HTMLParser class MyHTMLParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.recording = 0 self.data = [] def handle_starttag(self, tag, attrs): if tag == 'required_tag': for name, value in attrs: if name == 'somename' and value == 'somevale': print name, value print "Encountered the beginning of a %s tag" % tag self.recording = 1 def handle_endtag(self, tag): if tag == 'required_tag': self.recording -=1 print "Encountered the end of a %s tag" % tag def handle_data(self, data): if self.recording: self.data.append(data) p = MyHTMLParser() f = urllib2.urlopen('http://www.someurl.com') html = f.read() p.feed(html) print p.data p.close() 

`

Это прекрасно работает:

 print (soup.find('the tag').text)