我希望使用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)
答案 0 :(得分:4)
问题是minidom是一个非外部实体读取XML解析器。这意味着它甚至没有查看DTD,因此它不知道在HTML中,名为id
的属性对应于ID
模式类型。
这样做的另一个结果是minidom不会知道在XHTML文档类型中定义的特定于HTML的实体,如é
,因此您可能会丢失文本。
如果您不关心这一点,可以继续使用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。