python HTMLParserライブラリを使用して、HTMLページから値を取得しようとしています。取得したい値は、この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を取得するようにします。
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__
で設定-コアポイントを不明瞭にしないために、上記のコードの安価な一般化手順を回避しました(ネストされたタグの数をカウントし、記録状態がアクティブなときにデータをリストに蓄積します)。
BeautifulSoup を試しましたか?
from bs4 import BeautifulSoup
soup = BeautifulSoup('<div id="remository">20</div>')
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)