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」のテーブルにのみ含まれているリンクから返されるリンクを制限することはできません。使用するとgetElementByIdNoneが返されます。

これは、「月次短期販売」IDがDTD内で定義されていないためですか?もしそうなら、この情報を抽出するための最良の方法は何でしょうか?

これが私が現在使用しているコードです。これは機能しますが、神に対して罪を犯します。

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)

最初にTABLE要素を見つけてから、その要素でgetElemenetByTagNameを呼び出したいと思います。これにより、テーブル要素の子であるすべての要素が返されます。また、HTMLがXHTMLであることを再確認してください。minidomは、HTMLではなくXMLを解析することを目的としています。

4

2 に答える 2

4

問題は、minidomが外部エンティティを読み取らないXMLパーサーであるということです。つまり、DTDも調べないため、HTMLで名前の付いた属性がスキーマタイプidに対応していることはわかりません。ID

これのさらなる結果は、minidomが&eacute;XHTML doctypeで定義されているようなHTML固有のエンティティについて知らないため、その方法でテキストを失う可能性があることです。

これを気にしない場合は、引き続きminidomを使用し、別の方法を使用してテーブルにアクセスし、手動で関与getElementsByTagNameして確認することができelement.idます。(自分のgetElementById関数をハックして、ゆっくりと実行することもできます。)

または、pxdomなどの外部エンティティを許可するXMLパーサーを使用することもできます。ただし、これは、パーサーがW3からDTDを毎回フェッチして解析する必要があることを意味し、これは不快なほど遅くなります。

または、BeautifulSoupなどのHTMLエンティティとIDネスが組み込まれているHTMLパーサーを使用することもできます。これは、として機能する実際のHTMLページを扱う場合に適している可能性があります。これは、text/htmlXHTMLであると主張する場合もありますが、整形式ではないいたずらなビットが含まれていることがよくあります。

于 2010-01-12T19:09:08.150 に答える
0

最初に TABLE 要素を見つけてから、getElemenetByTagName を呼び出したいと思います。これは、テーブル要素の子であるすべての要素を返す必要があります。また、HTML が XHTML であることを再確認してください。minidom は、HTML ではなく XML を解析するためのものです。

于 2010-01-12T18:50:11.743 に答える