sgmllib

Topic: 
 
ตัวอย่างโค๊ดไพธอน ในการใช้งานมอดูล sgmllib เอามาใช้ในการจัดลำดับน้ำหนักให้กับเนื้อความใน HTML
โดยจะวิเคราะห์น้ำหนักจากแท็ก
(จุดประสงค์ที่แท้จริง คือจะเอาน้ำหนักนี้มาจัดลำดับความสำคัญในการค้นหาข้อมูล) เขียนโดยเอาตัวอย่างจาก เวลาใช้งานจะเอาตัวแปร self.data_line ไปใช้
ตัวอย่างการใช้งานคือ
กรณีข้อความธรรมดา
>>> import util
>>> data_list = util.HTML_weight_parse('This is the example of sgmllib.')
>>> data_list.data_line
[['This is the example of sgmllib.', 1]]
กรณีเป็นไฟล์ HTML
สมมุติว่าเนื้อไฟล์ test.html คือ



  abc



  this is x.html
  testlink



การใช้งานจะเป็นดังนี้
>>> import util
>>> f = open('test.html')
>>> data_list = util.HTML_weight_parse(f.read())
>>> data_list.data_line
[['abc', 11], ['this is x.html', 1], ['abc.com', 11], ['testlink', 11]]
เนื้อไฟล์ util.py มีดังนี้
#!/usr/bin/env python

import sgmllib

class HTML_weight_parse(sgmllib.SGMLParser):
    """Determine weight of text in HTML.
    input: text or html
    output = self.data_line : [[line1, weight1], ...]

    tag omitted data:
        script, style

    tag included attribute:
        meta name="keywords" content="..."
        img src="..." title="..." alt="..."
        a href="..."
    """

    weight_dict = { 'title':10, 'h1':10, 'h2':8, 'h3':7, 'h4':6, 'h5':5, 'h6':4 }

    def __init__(self, text):
        self.data = ''
        self.weight = 1
        self.data_line = []
        sgmllib.SGMLParser.__init__(self)
        for line in text.split('\n'):
            self.feed(line.strip())
        self.close()

    def handle_data(self, data):
        self.data += data

    def handle_comment(self, data): #bypass comment 
        pass

    def start_script(self, data): #bypass 
        pass

    def unknown_starttag(self, tag, attrs):
        self.flush()
        if attrs:  #tag with attributes
            meta_enable = False
            for name, value in attrs:
                if tag == "a":
                    if name == "href":
                       self.data += value
                       self.flush(False)
                elif tag == "meta":
                    if name == "name" and value == "keyword":
                        meta_enable = True
                        self.weight += 2
                    if name == "content" and meta_enable:
                        self.data += value
                        self.flush(False)
                        meta_enable = False
                elif tag == "img" and name in ["title", "alt"]:
                    self.data += value
                    self.flush(False)
                else:
                    self.flush()
        #tag with & without attribute
        if tag in self.weight_dict.keys():
            self.weight += self.weight_dict[tag]
        else:
            self.flush()

    def unknown_endtag(self, tag):
        self.flush()

    def close(self):
        sgmllib.SGMLParser.close(self)
        self.flush()