python - 用空白条目解析网站表

时间:2011-10-24 23:14:56

标签: python parsing

我正在编写一些从网站获取数据的python代码。桌子形成良好,大部分时间一切正常。

但是,当解析器遇到空白字段时,它完全忽略它。我需要它来计算空白,但我无法弄清楚如何做到这一点。

问题在于我使用的某些数组会给我out of bounds错误。

无论如何,这是我的代码:

class MyParser(HTMLParser):
    def __init__(self, *args, **kwargs):
        #There are only 2 tables in the source code. Outer one is useless to me
        self.outerloop = True
        #Set to true when we are in the table, and we want to collect data
        self.capture_data = False
        #Array to store the captured data
        self.dataArray = []
        HTMLParser.__init__(self, *args, **kwargs)

    def handle_starttag(self, tag, attrs):
        if tag == 'table' and self.outerloop:
            self.outerloop=False
        elif tag=='td' and not self.outerloop:
            self.capture_data=True
        elif tag=='th':
            self.capture_data=False

    def handle_endtag(self, tag):
        if tag == 'table':
            self.capture_data=False

    def handle_data(self, data):
        if self.capture_data:
            self.dataArray.append(data)

#Function to call the parser
def getData(self):
    self.p = MyParser()

    url = 'http://www.mysite.com/get.php'
    content = urllib.urlopen(url).read()
    self.p.feed(content)

    val=0
    resultString=""

    while val < len(self.p.dataArray):
        resultString+=self.p.dataArray[val]+","
        val+=1

    return HttpResponse(resultString[:-1])

问题在于handle_data功能。在某种程度上,我需要告诉它将<td></td>存储为,例如空字符串。这很重要,因为我将字符串作为逗号分隔的值列表输出到我的网页,如底部所示。

对于能帮助我的人,我将非常感激。

感谢。

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案是在找到cell_data=""时添加<td>,在cell_data += data上使用handle_data更新cell_data,并在</td>上添加{{1}} {1}}秒。

答案 1 :(得分:0)

好的,我知道回答你自己的问题不赞成,但如果有人在将来遇到这个问题,我会提出我的来源。

我通过2个整数来修复它。它们都从0开始。当我在questin中遇到开始标记时,我会增加其中一个数字。处理完数据后,我增加了第二个数字。当我遇到这个特定标签的结束标签时,我检查了数字是否相等,如果数据被消耗,它们应该是相同的。

如果事实证明数字不相等,则意味着程序没有处理数据,即空白标签。然后我简单地将N/A附加到数组中并使其正常工作。 见这里:

class MyHTMLParser(HTMLParser):
    def __init__(self, *args, **kwargs):
        self.outerloop = True
        self.capture_data = False
        self.dataArray = []
        self.celldata="NA"
        self.firstnum=0
        self.secondnum=0
        HTMLParser.__init__(self, *args, **kwargs)

    def handle_starttag(self, tag, attrs):
        if tag == 'table' and self.outerloop:
            self.outerloop=False
        elif tag=='td' and not self.outerloop:
            self.capture_data=True # bool to indicate we want to capture data
            self.firstnum+=1    # increment first num to say we have encountered the tag in question
        elif tag=='th':
            self.capture_data=False

    def handle_endtag(self, tag):
        if tag == 'table':
            self.capture_data=False
        elif tag == 'td' and not self.firstnum == self.secondnum:   #check if they are not equal
            self.dataArray.append(self.celldata)    # append filler data
            self.secondnum=self.firstnum    # make them equal for next tag

    def handle_data(self, data):
        if self.capture_data::
            self.dataArray.append(data)
            self.secondnum=self.firstnum

def getTides(self):
    self.p = MyHTMLParser()

    url = 'http://www.mysite.com/page.php'
    content = urllib.urlopen(url).read()
    self.p.feed(content)

    val=0
    resultString=""

    while val < len(self.p.dataArray):
        resultString+=self.p.dataArray[val]+","
        val+=1

    return HttpResponse(resultString[:-1])