使用minidom <table> </table>获取指定的HTML链接

时间:2010-01-12 18:15:27

标签: python minidom

我希望使用Python和xml.dom.minidom来获取表id指定的特定<table>内的链接列表。基于一些excellent advice,我试图使用DOM而不是模式匹配。

import urllib
import xml.dom.minidom

url = 'http://www.batstrading.com/market_data/shortsales'
page = xml.dom.minidom.parse(urllib.urlopen(url))

我可以通过标记名page.getElementsByTagName('a')获取所有链接,但我不能限制仅包含在ID为“每月 - 短期销售”的表格中的链接返回的链接。 使用getElementById返回None。

这是因为DTD中没有定义“每月 - 卖空”ID吗?如果是这样,提取此信息的最佳方法是什么?

以下是我正在使用的代码,它可以运行,但是对神的反对:

import urllib
import xml.dom.minidom
import datetime

url = 'http://www.batstrading.com/market_data/shortsales'

def getDownloadLink(alink, prefix = 'BATSsh'):
    """return (datetime.date, link) for the provided link if the link
    target starts with the data file prefix"""

    n = len(prefix)
    href = alink.getAttribute('href')
    if href.startswith(prefix) and (len(href) == 25):
        year = int(href[n:n+4])
        month = int(href[n+4:n+6])
        day = int(href[n+6:n+8])
        date = datetime.date(year, month, day)
        return (date, url + '/' + href)

page = xml.dom.minidom.parse(urllib.urlopen(url))
link = (getDownloadLink(a) for a in page.getElementsByTagName('a'))
link = dict(i for i in link if i is not None)

2 个答案:

答案 0 :(得分:4)

问题是minidom是一个非外部实体读取XML解析器。这意味着它甚至没有查看DTD,因此它不知道在HTML中,名为id的属性对应于ID模式类型。

这样做的另一个结果是minidom不会知道在XHTML文档类型中定义的特定于HTML的实体,如&eacute;,因此您可能会丢失文本。

如果您不关心这一点,可以继续使用minidom并使用其他方法获取表格,包括getElementsByTagName并手动检查element.id。 (您可以通过自己的getElementById函数来缓慢地执行此操作。)

或者您可以使用允许外部实体(如pxdom)的XML解析器。但是这意味着解析器每次都必须从W3中获取和解析DTD,这将是令人不快的慢。

或者您可以选择HTML解析器,它包含内置的HTML实体和ID-nesses,例如BeautifulSoup。当您处理作为text/html的真实HTML页面时,这可能是一个更好的主意,虽然它们可能声称是XHTML,但通常包含格式不正确的淘气位。

答案 1 :(得分:0)

我认为您要先找到TABLE元素,然后在其上调用getElemenetByTagName。这应该返回表元素上所有 a 元素。另外,仔细检查您的HTML是否为XHTML; minidom用于解析XML,而不是HTML。