2017-01-24 6 views
0

Я ищу, чтобы очистить данные из таблицы HTML, используя только стандартный Python HTML Parser. Мне нужно придерживаться фондовых инструментов, так как код будет широко распространен, и я не могу взять время, чтобы поддержать тех, кто нуждается в установке BeautifulSoup, lxlml и т.д.Scrape HTML-таблица со стандартным Python HTMLParser

Например, в 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-таблицы. У кого-нибудь есть метод для извлечения данных или значений href из таблицы с использованием стандартных методов разбора HTML?

+0

Обдумал это. Необходимо создать счетчик в синтаксическом анализаторе для регистрации, когда парсер кормится информацией из таблицы HTTP. Также обрабатываются исключения (например, каталоги и другие нежелательные hrefs) с операторами if. – 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() 
Смежные вопросы