使用标准Python HTMLParser

时间:2017-01-24 01:48:46

标签: python html html-parsing

我希望仅使用标准的Python HTML Parser从HTML表中抓取数据。我需要坚持使用库存工具,因为代码将被广泛分发,我不能花时间来支持那些需要安装BeautifulSoup,lxlml等的人。

例如,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>
.
.
.
&#13;
&#13;
&#13;

我希望能够提取数据&#39;在此表中。更具体地说,数据将是以* .png结尾的所有属性值。它们与表中的数据具有相同的名称。我不想明确声明我想要刮掉* .png文件,因为我想在不同的目录中使用这个代码,这些目录将具有不同的文件格式。我尝试过一些代码尝试使用名称&#39; href&#39;来提取所有属性的值,但这也会返回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

因为还有一些&#39; a&#39;生活在HTML表格之外的标签。是否有人使用标准HTML解析方法从表中提取数据或href值?

1 个答案:

答案 0 :(得分: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()