无法正确解析<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。
分享到:
相关推荐
最后,`SGMLParser`也是Python标准库的一部分,它用于解析SGML(Standard Generalized Markup Language)和HTML文档。虽然`HTMLParser`通常被认为更现代且功能更强大,但在某些场景下,`SGMLParser`可能更适合。然而...
作者使用了多个 Python 库,例如 SGMLParser 库、threading 库等,来实现爬虫的功能。 9.爬虫的性能瓶颈 爬虫的性能瓶颈主要在于网络传输的速度,因此作者使用了多线程编程来提高爬虫的性能。 10. Python 语言的...
【Python实现网络爬虫】 网络爬虫是一种自动化程序,用于抓取互联网上的信息。Python作为一门强大且易学的语言,是编写爬虫的常用选择。本文将介绍如何使用Python进行网络爬虫的基本操作,包括获取网页内容、提取...
Python 提供了多种方式可以用来实现网络爬虫,例如使用 urllib 库、httplib 库、SGMLParser 库和 pycurl 库等。每种方式都有其优缺,选择哪种方式取决于具体的应用场景。 此外,Python 还提供了其他库可以用来实现...
这里展示了一个名为`Html2txt`的类,它是基于SGMLParser的子类。这个类定义了一些方法来处理HTML数据。`reset()`方法初始化文本变量,并设置`inbody`为True,表示我们处于HTML主体部分。`handle_data(text)`方法在...
2. **网页内容提取**:在上述代码中,`SGMLParser`是Python标准库`sgmllib`的一部分,用于解析HTML或SGML文档。`Html2txt`类是自定义的解析器,通过重写`handle_data`方法来处理HTML中的文本内容。`start_head`和`...
- 类如`sgmllib.SGMLParser`。 - **htmllib模块**(已废弃) - 提供HTML解析器。 - 类如`htmllib.HTMLParser`。 - **htmlentitydefs模块**(已废弃) - 定义了HTML实体的名称到Unicode的映射。 - 属性如`...
`HTMLParser` 类虽然也内置在 Python 中,但文档指出它可能不够易用,因此选择了 `SGMLParser`。 在示例程序中,创建了一个名为 `ListName` 的类,该类继承自 `SGMLParser`。`ListName` 类中有几个关键方法: 1. `...
SGMLParser-sp1_3_4(win32)是一个专为Windows 32位操作系统设计的SGML解析工具,其版本号为1_3_4。SGML,全称Standard Generalized Markup Language,是HTML的前身,也是一种用于标记结构化文档的国际标准。这个...
### Python爬虫技术详解 #### 一、爬虫技术概览 爬虫技术,作为数据挖掘及测试技术的重要部分,在互联网行业中占据着举足轻重的地位。它不仅支撑着搜索引擎等核心业务,对于个人用户来说也有诸多应用价值,如收集...
在提供的代码示例中,使用了SGMLParser类(在旧版Python中)来解析HTML内容并提取文本。`Html2txt`类继承自`SGMLParser`,并重写了`handle_data`方法来收集在`<body>`标签内的文本。当解析到`<head>`标签时,`inbody...
Python网络爬虫是一种用于自动化地从互联网上抓取大量数据的技术。在Python中,我们可以使用多种库来实现这一目标,如`urllib`、`requests`、`BeautifulSoup`、`Scrapy`等。以下是一些关于Python网络爬虫的基本知识...
SGMLParser-sp-1.3.4(linux) 是一个专为Linux操作系统设计的SGML(Standard Generalized Markup Language)解析工具的版本1.3.4。SGML是一种早期的标记语言,它是XML(eXtensible Markup Language)的前身,用于结构...
这里用到了SGMLParser,一种用于解析HTML和XML的Python库,能够帮助开发者定位到form表单和input元素。 提到的urlopen是Python标准库中的一个方法,用于发起网络请求。文档中展示了如何使用urllib2构建一个带有...
对于HTML解析,sgmllib库提供了一种基础方法,需要创建一个自定义类继承自SGMLParser,并重写其方法以处理特定的HTML标签。通过`.feed(data)`方法,可以将HTML内容传递给解析器进行处理。 总之,Python爬虫技术涉及...
本文实例讲述了Python实现登录人人网并抓取新鲜事的方法。分享给大家供大家参考。具体如下: 这里演示了Python登录人人网并抓取新鲜事的方法(抓取后的排版不太美观~~) from sgmllib import SGMLParser import sys...