Разбор тега <span>и получение данных с помощью python - PullRequest
2 голосов
/ 07 декабря 2011

Я новичок в stackoverflow, и это мой первый вопрос.

Я пишу скрипт на Python для разбора HTML-страницы. Страница выглядит так:

<TABLE style="border: 1px solid black">

<TR>
    <TD colspan="2"><span id="text1" style="color: white">DATA1</span></TD>
</TR>
<TR>    
    <TD class="rowLabel" valign="top">Data name</TD>
    <TD valign="top" width="100"><span id="somename1" class="alsoname">DATA2</span></TD>
</TR>   
<TR>    
    <TD class="rowLabel" valign="top">Data name</TD>
    <TD valign="top" width="100"><span id="somename2" class="alsoname">DATA3</span></TD>
</TR>                                               
<TR>
    <TD class="rowLabel" valign="top">Data name</TD>
    <TD valign="top" width="100"><span id="somename3" class="alsoname">DATA4</span></TD>
</TR>
<TR>
    <TD class="rowLabel" valign="top">Data name</TD>
    <TD valign="top" width="100"><span id="somename4" class="alsoname">DATA5</span></TD>
</TR>
<TR>
    <TD class="rowLabel" valign="top">Data name</TD>
    <TD valign="top" width="100"><span id="somename5" class="alsoname">DATA6</span></TD>
</TR>                                               
<TR>
    <TD class="rowLabel" valign="top">Data name</TD>
    <TD valign="top" width="100"><span id="somename6" class="alsoname">DATA7</span></TD>
</TR>
<TR>
    <TD class="rowLabel" valign="top">Data name</TD>
    <TD valign="top" width="100"><span id="somename7" class="alsoname">DATA8</span></TD>
</TR>                           

Я хотел бы собрать значения DATA из скобок на основе имени идентификатора диапазона. Если идентификатор диапазона == somename1, поместите его значение DATA в переменную.

пока у меня есть этот код:

from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        if tag == 'span':
            for name, value in attrs:
                if name == 'id' and value == 'somename1':
                    print 'ID', value
                elif name == 'id' and value == 'somename2':
                    print 'ID', value
                elif name == 'id' and value == 'somename3':
                    print 'ID', value
                else :
                    print 'NO DATA'

p = MyHTMLParser()
p.feed(flush)  

Кто-нибудь может мне помочь?

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Я считаю, что использовать BeautifulSoup с любым видом HTML намного проще.

from BeautifulSoup import BeautifulSoup as bs
from urllib2 import urlopen

data = urlopen('wherever').read()

soup = bs(data)

for span in soup.findAll('span'):
    print span['id'], span.text

Возможно, вам придется уточнить некоторые его части, поскольку вы предоставили только таблицу.

0 голосов
/ 07 декабря 2011

Переопределение метода handle_starttag недостаточно. К сожалению, базовый HTMLParser не совсем ... годный к употреблению , на мой взгляд, возможно, вы взглянули на BeautifulSoup . Вы можете сделать это так:

class MyHTMLParser(HTMLParser):
    def __init__(self):
        self.collect_data = False
        self.tagname = None
        self.id = None

    def handle_starttag(self, tag, attrs):
        if tag == 'span':
            for name, value in attrs:
                if name == 'id' and value == 'somename1':
                    self.collect_data = True
                    self.tagname = tag
                    self.id = value

    def handle_data(self, data):
        if self.collect_data:
            self.somevar = data
            self.collect_data = False

            print "Tag: %s ID: %s" % (self.tagname, self.id)
            print "Data: %s" % data

С помощью collect_data мы заявляем, что хотим поместить следующие входящие данные (в методе handle_data) в переменную. Мы включаем это логическое значение, когда id равно somename1, и отключаем его, когда мы собираем данные. Не очень красиво, не правда ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...