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
>>> ...

上記は、 CLASS属性の<td>タグで見つかったすべての値を示しています。ビット (in ) と(の値として)を動的に割り当てる方法はありますか?tdstart_tdclasskoptparse

tagLister.py -t td -k class

静的にコーディングするのではなく?コマンドラインから任意のタグ (例<a>:<div>など) および関連する属性 (例: など) にhrefこのクラスを [再] 使用するつもりです。idどんな助けでも大歓迎です。

4

1 に答える 1

3

1つのオプションは、XPathに切り替えてlxml.html使用することです。その結果は、すでにリストになっています...(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 に答える