Mar*_*tin 37 html python parsing html-parsing
我试图使用python HTMLParser库从HTML页面中获取值.我想要掌握的值是在这个html元素中:
...
<div id="remository">20</div>
...
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我的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()
Run Code Online (Sandbox Code Playgroud)
有人能指出我正确的方向吗?我希望类功能获得值20.
Ale*_*lli 55
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)
Run Code Online (Sandbox Code Playgroud)
self.recording计算div从"触发"标记开始的嵌套标记的数量.当我们位于以触发标记为根的子树中时,我们会累积数据self.data.
解析结尾处的数据保留在self.data(字符串列表中,如果没有满足触发标记,则可能为空).您从类外部的代码可以直接从解析结束时的实例访问列表,或者您可以为此目的添加适当的访问器方法,具体取决于您的目标究竟是什么.
这个类可以很容易地取得多一点的一般使用,以代替在代码中看到上面的常量文字串,'div','id',和'remository',实例属性self.tag,self.attname并self.attvalue通过设置__init__从传递给它的参数-我避免了廉价的推广步骤在上面的代码中,以避免模糊核心点(跟踪嵌套标签的计数,并在记录状态处于活动状态时将数据累积到列表中).
小智 25
你试过BeautifulSoup吗?
from bs4 import BeautifulSoup
soup = BeautifulSoup('<div id="remository">20</div>')
tag=soup.div
print(tag.string)
Run Code Online (Sandbox Code Playgroud)
这给你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()
Run Code Online (Sandbox Code Playgroud)
`