2017-01-24 9 views
0

標準のPython HTMLパーサーのみを使用してHTMLテーブルからデータをスクレイプします。私はコードが広く配布され、私はBeautifulSoupをインストールするために必要とする人々を支援するための時間を取ることができないので、株価のツールに固執する必要があり、lxlmlなど標準のPython HTMLパーサーを使用したHTMLテーブルのスクラブ

例えば、HTMLコード:

<table id="indexlist"> 
 
    <tbody> 
 
    <tr class="indexhead"> 
 
     <th class="indexcolicon"> 
 
     <img src="/icons/blank.gif" alt="[ICO]"> 
 
     </th> 
 
     <th class="indexcolname"> 
 
     <a href="?C=N;O=D">Name 
 
     </a> 
 
     </th> 
 
     <th class="indexcollastmod"> 
 
     <a href="?C=M;O=A">Last modified 
 
     </a> 
 
     </th> 
 
     <th class="indexcolsize"> 
 
     <a href="?C=S;O=A">Size 
 
     </a> 
 
     </th> 
 
    </tr> 
 
    <tr class="parent"> 
 
    <td class="indexcolicon"> 
 
     <a href="/pub/DATASETS/nsidc0081_nrt_nasateam_seaice/browse/"> 
 
     <img src="/icons/back.gif" alt="[PARENTDIR]"> 
 
     </a> 
 
    </td> 
 
    <td class="indexcolname"> 
 
     <a href="/pub/DATASETS/nsidc0081_nrt_nasateam_seaice/browse/">Parent Directory 
 
     </a> 
 
    </td> 
 
    <td class="indexcollastmod">&nbsp; 
 
    </td> 
 
    <td class="indexcolsize"> - 
 
    </td> 
 
    </tr> 
 
    <tr class="odd"> 
 
    <td class="indexcolicon"> 
 
     <a href="nt_20150101_f17_nrt_n.png"> 
 
     <img src="/icons/image2.gif" alt="[IMG]"> 
 
     </a> 
 
    </td> 
 
    <td class="indexcolname"> 
 
     <a href="nt_20150101_f17_nrt_n.png"> 
 
     nt_20150101_f17_nrt_n.png 
 
     </a> 
 
    </td> 
 
    <td class="indexcollastmod"> 
 
     2015-03-10 11:25 
 
    </td> 
 
    <td class="indexcolsize"> 56K 
 
    </td> 
 
    </tr> 
 
    <tr class="even"> 
 
    <td class="indexcolicon"> 
 
    <a href="nt_20150102_f17_nrt_n.png"> 
 
     <img src="/icons/image2.gif" alt="[IMG]"> 
 
     </a> 
 
    </td> 
 
    <td class="indexcolname"> 
 
     <a href="nt_20150102_f17_nrt_n.png"> 
 
     nt_20150102_f17_nrt_n.png 
 
     </a> 
 
    </td> 
 
. 
 
. 
 
.

この表の中の「データ」を抽出できます。具体的には、データは* .pngで終わるすべての属性値になります。これらは、表内のデータと同じ名前を共有します。 * .pngファイルをスクレープしたいと明示的に宣言したくないのは、異なるファイル形式を持つ異なるディレクトリでこのコードを使用したいからです。私は 'href'という名前ですべての属性の値を抽出しようとするいくつかのコードを試しましたが、これはHTML本体内の他の多くの属性も返します。データのみをスクレイピングすると、テーブルの外にあるインスタンスも返されます。たとえば:

class MyHTMLParser(HTMLParser): 
def __init__(self): 
    HTMLParser.__init__(self) 
    self.inLink = False 
    self.dataArray = [] 

def handle_starttag(self, tag, attrs): 
    self.inLink = False 
    if tag == 'a': 
     for name, value in attrs: 
      if name == 'href': 
       self.inLink = True 
       self.lasttag = tag 

def handle_data(self, data): 
    if self.lasttag == 'a' and self.inLink and data.strip(): 
     self.dataArray.append(data) 

しかし、これは次の値を返します。

nt_20170119_f18_nrt_n.png 
    nt_20170120_f18_nrt_n.png 
    nt_20170121_f18_nrt_n.png 
    nt_20170122_f18_nrt_n.png 
    Home 
    | 
    Contact Us 

HTMLテーブル外に住む少数「」タグもあるので。誰かが、標準のHTML解析メソッドを使用してテーブル内からデータまたはhrefの値を抽出する方法を持っていますか?

+0

これがわかりました。パーサにHTTPテーブル内の情報が入力されたときにログに記録するために、パーサ内にカウンタを作成する必要がありました。また、if文で例外(例えば、ディレクトリやその他の不要なHrefs)を処理​​しました。 – GDeezy

答えて

0
class MyHTMLParser(HTMLParser): 
def __init__(self): 
    HTMLParser.__init__(self) 
    self.inLink = False 
    self.dataList = [] 
    self.directory = '/' 
    self.indexcol = ';' 
    self.Counter = 0 

def handle_starttag(self, tag, attrs): 
    self.inLink = False 
    if tag == 'table': 
     self.Counter += 1 
    if tag == 'a': 
     for name, value in attrs: 
      if name == 'href': 
       if self.directory in value or self.indexcol in value: 
        break 
       else: 
        self.inLink = True 
        self.lasttag = tag 

def handle_endtag(self, tag): 
     if tag == 'table': 
      self.Counter +=1 

def handle_data(self, data): 
    if self.Counter == 1: 
     if self.lasttag == 'a' and self.inLink and data.strip(): 
      self.dataList.append(data) 

parser = MyHTMLParser() 
関連する問題