1

我正在寻找使用 Python 和 xml.dom.minidom 来获取<table>由表 id 指定的特定链接列表。基于一些优秀的建议,我正在尝试使用 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 为“monthly-short-sale”的表中的链接返回的链接。使用getElementById返回无。

这是因为 DTD 中没有定义“monthly-short-sale”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)

使用 SvnKit 和 Netbeans?

有没有办法让 Netbeans 6.7/8 与 SVNkit 一起工作?

我正在寻找一个插件来替换内置的 SVN Netbeans 插件或类似的解决方案。现在,我的解决方法是复制所有 jsvn 命令并将副本重命名为 svn 等效命令。它有效,但它令人头疼。

编辑:至于我为什么要这样做,它使 Eclipse 和 Netbeans 在 linux 机器上共享单个项目实例成为可能。在 Windows 上,这没关系,因为 Eclipse 可以使用 javahl 访问 svn。

4

2 回答 2

4

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

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

如果您不关心这一点,您可以继续使用 minidom 并使用另一种方式进入牌桌,手动参与getElementsByTagName和检查。element.id(您可以破解自己的getElementById功能以缓慢的方式完成。)

或者,您可以使用允许外部实体(例如 pxdom)的 XML 解析器。然而,这意味着解析器每次都必须从 W3 获取和解析 DTD,这将非常缓慢。

或者你可以选择一个 HTML 解析器,它内置了 HTML 实体和 ID-ness,例如 BeautifulSoup。当您在处理作为text/html.

于 2010-01-12T19:09:08.150 回答
0

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

于 2010-01-12T18:50:11.743 回答