Как я могу использовать библиотеку HTMLParser python для извлечения данных из определенного тега div?
Я пытаюсь получить значение из HTML-страницы, используя библиотеку HTML-Python. Значение, которое я хочу получить, находится внутри этого элемента html:
...
<div id="remository">20</div>
...
Это мой класс 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()
Может ли кто-нибудь указать мне в правильном направлении? Я хочу, чтобы функциональность класса получала значение 20.
Ответы
Ответ 1
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
(список строк, возможно, пуст, если не был встречен триггерный тег). Ваш код извне класса может получить доступ к списку непосредственно из экземпляра в конце разбора или вы можете добавить соответствующие методы доступа для этой цели, в зависимости от вашей цели.
Класс можно легко сделать немного более общим, используя вместо строк с постоянным литеральным отображением в приведенном выше коде 'div'
, 'id'
и 'remository'
, атрибуты экземпляра self.tag
, self.attname
и self.attvalue
, установленный __init__
из переданных ему аргументов - я избегал этого дешевого шага обобщения в приведенном выше коде, чтобы избежать затенения основных точек (отслеживать количество вложенных тегов и накапливать данные в список, когда состояние записи активно).
Ответ 2
Вы пробовали BeautifulSoup?
from bs4 import BeautifulSoup
soup = BeautifulSoup('<div id="remository">20</div>')
tag=soup.div
print(tag.string)
Это дает вам 20
на выходе.
Ответ 3
Небольшая коррекция в строке 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()
`
Ответ 4
Это отлично работает:
print (soup.find('the tag').text)