`
john2007
  • 浏览: 77841 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论
阅读更多

无法正确解析<br/><img src=""/>等单个标签:

 

测试代码如下:

 

class TestSGMLParser(SGMLParser):

    def __init__(self, verbose=0):
        self.testdata = ""
        SGMLParser.__init__(self, verbose)

    def handle_data(self, data):
        self.testdata = self.testdata + data
        if len(repr(self.testdata)) >= 70:
            self.flush()

    def flush(self):
        data = self.testdata
        if data:
            self.testdata = ""
            print 'data:', repr(data)

    def handle_comment(self, data):
        self.flush()
        r = repr(data)
        if len(r) > 68:
            r = r[:32] + '...' + r[-32:]
        print 'comment:', r

    def unknown_starttag(self, tag, attrs):
        self.flush()
        if not attrs:
            print 'start tag: <' + tag + '>'
        else:
            print 'start tag: <' + tag,
            for name, value in attrs:
                print name + '=' + '"' + value + '"',
            print '>'

    def unknown_endtag(self, tag):
        self.flush()
        print 'end tag: </' + tag + '>'

    def unknown_entityref(self, ref):
        self.flush()
        print '*** unknown entity ref: &' + ref + ';'

    def unknown_charref(self, ref):
        self.flush()
        print '*** unknown char ref: &#' + ref + ';'

    def unknown_decl(self, data):
        self.flush()
        print '*** unknown decl: [' + data + ']'

    def close(self):
        SGMLParser.close(self)
        self.flush()
        
if __name__=="__main__":
    #htmldata=urllib.urlopen("http://www.sogou.com").read().decode("gbk")
    #pros=BaseHTMLProcessor()
    #pros.feed(htmldata)
    #print pros.gethtmltext()
    htmldata="""<html><head><title>Google Page</title></head><body> 
    <table id="tab">
        <tr id="tr1"><td id="tr1td1">tr1 td1</td><td>tr1 td2</td><td>tr1 td3</td></tr>
        <tr id="tr2"><td id="tr2td1">tr2 td1</td><td>tr2 td2</td><td>tr2 td3</td></tr>
    </table>
    <br/>
    <img src="http://www.baidu.com/img/baidu_logo.gif" id="baidulogo" /><br/>
    <a href="http://baidu.com">baidu</a><br/>
    <b>bold font</b><br/>
    
    <script language="javascript">alert("hello, world ");</script>
    <style>#tab{background-color:#fcdad5;}</style>
    </body></html>
    """
    pros=TestSGMLParser() #BaseHTMLProcessor()
    pros.feed(htmldata)

    

 输出如下:

 

start tag: <html>
start tag: <head>
start tag: <title>
data: 'Google Page'
end tag: </title>
end tag: </head>
start tag: <body>
data: ' \n    '
start tag: <table id="tab" >
data: '\n        '
start tag: <tr id="tr1" >
start tag: <td id="tr1td1" >
data: 'tr1 td1'
end tag: </td>
start tag: <td>
data: 'tr1 td2'
end tag: </td>
start tag: <td>
data: 'tr1 td3'
end tag: </td>
end tag: </tr>
data: '\n        '
start tag: <tr id="tr2" >
start tag: <td id="tr2td1" >
data: 'tr2 td1'
end tag: </td>
start tag: <td>
data: 'tr2 td2'
end tag: </td>
start tag: <td>
data: 'tr2 td3'
end tag: </td>
end tag: </tr>
data: '\n    '
end tag: </table>
data: '\n    '
start tag: <br>
data: '>\n    <img src="http:'
end tag: </br>
data: '/www.baidu.com/img/baidu_logo.gif" id="baidulogo" />'
start tag: <br>
data: '>\n    <a href="http:'
end tag: </br>
data: '/baidu.com">baidu'
end tag: </a>
start tag: <br>
data: '>\n    <b>bold font<'
end tag: </br>
data: 'b>'
start tag: <br>
data: '>\n    \n    <script language="javascript">alert("hello, world ");<'
end tag: </br>
data: 'script>\n    '
start tag: <style>
data: '#tab{background-color:#fcdad5;}'
end tag: </style>
data: '\n    '
end tag: </body>
end tag: </html>

 

从输出可见:<br/> <img/>都没有被正确解析。

 

错误根源可以从sgmllib.py找到

 

另有人报:sgmlparser 解析时,把标签事件属性js代码中的大于号(> )误作为结束标记。

 

这两个bug,其实都是正则表达式惹的祸。

 

所以做网页内容提取时,尽量不要用正则,而是在把html转换为xhtml后,用dom解析,或者xpath。

 

 

分享到:
评论

相关推荐

    python解析html的几种方法

    最后,`SGMLParser`也是Python标准库的一部分,它用于解析SGML(Standard Generalized Markup Language)和HTML文档。虽然`HTMLParser`通常被认为更现代且功能更强大,但在某些场景下,`SGMLParser`可能更适合。然而...

    用python编写网络爬虫.docx

    作者使用了多个 Python 库,例如 SGMLParser 库、threading 库等,来实现爬虫的功能。 9.爬虫的性能瓶颈 爬虫的性能瓶颈主要在于网络传输的速度,因此作者使用了多线程编程来提高爬虫的性能。 10. Python 语言的...

    用Python实现网络爬虫、蜘蛛.doc

    【Python实现网络爬虫】 网络爬虫是一种自动化程序,用于抓取互联网上的信息。Python作为一门强大且易学的语言,是编写爬虫的常用选择。本文将介绍如何使用Python进行网络爬虫的基本操作,包括获取网页内容、提取...

    Python实现网络爬虫、蜘蛛.pdf

    Python 提供了多种方式可以用来实现网络爬虫,例如使用 urllib 库、httplib 库、SGMLParser 库和 pycurl 库等。每种方式都有其优缺,选择哪种方式取决于具体的应用场景。 此外,Python 还提供了其他库可以用来实现...

    python做网络爬虫

    这里展示了一个名为`Html2txt`的类,它是基于SGMLParser的子类。这个类定义了一些方法来处理HTML数据。`reset()`方法初始化文本变量,并设置`inbody`为True,表示我们处于HTML主体部分。`handle_data(text)`方法在...

    Python抓取页面、Pthon爬虫参考资料

    2. **网页内容提取**:在上述代码中,`SGMLParser`是Python标准库`sgmllib`的一部分,用于解析HTML或SGML文档。`Html2txt`类是自定义的解析器,通过重写`handle_data`方法来处理HTML中的文本内容。`start_head`和`...

    python standerd labrary中文版

    - 类如`sgmllib.SGMLParser`。 - **htmllib模块**(已废弃) - 提供HTML解析器。 - 类如`htmllib.HTMLParser`。 - **htmlentitydefs模块**(已废弃) - 定义了HTML实体的名称到Unicode的映射。 - 属性如`...

    python提取html当中的信息.docx

    `HTMLParser` 类虽然也内置在 Python 中,但文档指出它可能不够易用,因此选择了 `SGMLParser`。 在示例程序中,创建了一个名为 `ListName` 的类,该类继承自 `SGMLParser`。`ListName` 类中有几个关键方法: 1. `...

    SGMLParser-sp1_3_4(win32)

    SGMLParser-sp1_3_4(win32)是一个专为Windows 32位操作系统设计的SGML解析工具,其版本号为1_3_4。SGML,全称Standard Generalized Markup Language,是HTML的前身,也是一种用于标记结构化文档的国际标准。这个...

    python爬虫.docx

    ### Python爬虫技术详解 #### 一、爬虫技术概览 爬虫技术,作为数据挖掘及测试技术的重要部分,在互联网行业中占据着举足轻重的地位。它不仅支撑着搜索引擎等核心业务,对于个人用户来说也有诸多应用价值,如收集...

    python爬虫

    在提供的代码示例中,使用了SGMLParser类(在旧版Python中)来解析HTML内容并提取文本。`Html2txt`类继承自`SGMLParser`,并重写了`handle_data`方法来收集在`&lt;body&gt;`标签内的文本。当解析到`&lt;head&gt;`标签时,`inbody...

    python网络爬虫代码资料

    Python网络爬虫是一种用于自动化地从互联网上抓取大量数据的技术。在Python中,我们可以使用多种库来实现这一目标,如`urllib`、`requests`、`BeautifulSoup`、`Scrapy`等。以下是一些关于Python网络爬虫的基本知识...

    SGMLParser-sp-1.3.4(linux)

    SGMLParser-sp-1.3.4(linux) 是一个专为Linux操作系统设计的SGML(Standard Generalized Markup Language)解析工具的版本1.3.4。SGML是一种早期的标记语言,它是XML(eXtensible Markup Language)的前身,用于结构...

    利用Python的Twisted框架实现webshell密码扫描器的教程

    这里用到了SGMLParser,一种用于解析HTML和XML的Python库,能够帮助开发者定位到form表单和input元素。 提到的urlopen是Python标准库中的一个方法,用于发起网络请求。文档中展示了如何使用urllib2构建一个带有...

    python爬虫.doc

    对于HTML解析,sgmllib库提供了一种基础方法,需要创建一个自定义类继承自SGMLParser,并重写其方法以处理特定的HTML标签。通过`.feed(data)`方法,可以将HTML内容传递给解析器进行处理。 总之,Python爬虫技术涉及...

    Python实现登录人人网并抓取新鲜事的方法

    本文实例讲述了Python实现登录人人网并抓取新鲜事的方法。分享给大家供大家参考。具体如下: 这里演示了Python登录人人网并抓取新鲜事的方法(抓取后的排版不太美观~~) from sgmllib import SGMLParser import sys...

Global site tag (gtag.js) - Google Analytics