2

我正在编写一个脚本以使用此自定义类从 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)

每当找到 <td> 标记时,SGMLParser 就会被调用start_td并查找该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位(in start_td)和class(作为 的值k),以便使用optparse,它可以动态分配,如下所示:

tagLister.py -t td -k class

而不是静态编码?我打算将此类用于命令行中的任何标记(例如<a><div>)和相关属性(例如hrefid)。任何帮助将不胜感激。

4

1 回答 1

3

一种选择是切换到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']
于 2012-12-07T10:27:36.327 回答