python - 从 HTML 页面动态提取数据

标签 python class html-parser

我正在编写一个脚本,使用此自定义类从 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> 等)和关联属性(例如 hrefid 等)。任何帮助将不胜感激。

最佳答案

一个选择是切换到 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/

相关文章:

php - 在php中解析HTML表格

python - Python 中分离表单和处理

java - 找出没有连续重复字符的最长子串的长度

c++ - 是否可以从继承类对象访问基类的构造函数?

javascript - 类中类?

JavaScript 类

java - org.htmlparser.Parse ,需要获取 h3 之间的内容

java - 替换Java中IMG标签中的src属性

python - :TypeError: argument of type 'function' is not iterable", 但在单独测试时有效

python - 鼠标位置 Python Tkinter