我正在编写一个脚本,使用此自定义类从 HTML 文档(本例中为 Nagios 状态页)中提取一些字符串/数据:
## tagLister.py
from sgmllib import SGMLParser
class TAGLister(SGMLParser):
def reset(self):
SGMLParser.reset(self)
self.urls = []
def start_td(self, attrs):
CLS = [ v for k, v in attrs if k == 'class' ]
if CLS:
self.urls.extend(CLS)
只要找到
start_td
就会调用 SGMLParser。并查找 CLASS
属性。
>>> import urllib, tagLister
>>> usock = urllib.urlopen("http://www.someurl.com/test/test_page.html")
>>> parser = tagLister.TAGLister()
>>> parser.feed(usock.read())
>>> for url in parser.urls: print url
>>> ...
上面列出了 <td>
中找到的所有值CLASS 属性的标记。
有没有办法动态分配 td
位(在 start_td
中)和 class
(作为 k
的值),以便使用 optparse
,它可以动态分配,如下所示:
tagLister.py -t td -k class
而不是静态编码?我打算从命令行将此类[重新]用于任何标记(例如 <a>
、 <div>
等)和关联属性(例如 href
、 id
等)。任何帮助将不胜感激。
最佳答案
一个选择是切换到 lxml.html
并使用 XPath - 其结果将已经是一个列表...(并且由于 XPath 表达式只是一个字符串 - 更容易制定而不是玩弄类继承)
>>> tag = 'a'
>>> attr = 'href'
>>> xpq = '//{}/@{}'.format(tag, attr)
>>> a = '<a href="test-or-something">hello</a><a>No href here</a><a href="something-else">blah</a>'
>>> import lxml.html
>>> lxml.html.fromstring(a).xpath(xpq)
['test-or-something', 'something-else']
如果您必须使用 stdlib - 那么您可以使用 HTMLParser 执行类似的操作
from HTMLParser import HTMLParser
class ListTags(HTMLParser):
def __init__(self, tag, attr):
HTMLParser.__init__(self)
self.tag = tag
self.attr = attr
self.matches = []
def handle_starttag(self, tag, attrs):
if tag == self.tag:
ad = dict(attrs)
if self.attr in ad:
self.matches.append(ad[self.attr])
>>> lt = ListTags('a', 'href')
>>> lt.feed(a)
>>> lt.matches
['test-or-something', 'something-else']
关于python - 从 HTML 页面动态提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13760909/