`
canofy
  • 浏览: 829776 次
  • 性别: Icon_minigender_1
  • 来自: 北京、四川
社区版块
存档分类
最新评论

python 解析url

阅读更多
摘录了dive into python的例子
有两种方法,HTMLParser和SGMLParser
第一种:
#-*-coding:utf-8-*-
import  HTMLParser
#html解析,继承HTMLParser类
class MyHTMLParser(HTMLParser.HTMLParser):
    def _init(self):
        HTMLParser.HTMLParser.__init__(self);

        
# 处理开始标签和结束标签 -- finish processing of start+end tag: <tag.../>
    def handle_startendtag(self, tag, attrs):
        self.handle_starttag(tag, attrs)
        self.handle_endtag(tag)

    #handle start tag
   #处理开始标签和结束标签 这里打印出a标签的href的属性值
    def handle_starttag(self,tag, attrs):
        if tag=='a':
             for name,value in attrs:
                 if  name=='href':
                     print  value  

    # 处理结束标签,比如</xx> -- handle end tag
    def handle_endtag(self,tag):
        pass;

    # 处理特殊字符串,就是以&#开头的,一般是内码表示的字符 -- handle character reference
    def handle_charref(self, name):
        pass

    # 处理一些特殊字符,以&开头的,比如 &nbsp; -- handle entity reference
    def handle_entityref(self, name):
        pass

    # 处理数据,就是<xx>data</xx>中间的那些数据 -- handle data
    def handle_data(self, data):
        pass

    # 处理注释 -- handle comment
    def handle_comment(self, data):
        pass

    # 处理<!开头的,比如<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" -- handle declaration
    def handle_decl(self, decl):
        pass

    # 处理形如<?instruction>的东西 -- handle processing instruction
    def handle_pi(self, data):
        pass
    
    

a='<body><a href="www.163.com">test</a></body>'    
print a
my=MyHTMLParser()
my.feed(a)
#结果为www.163.com


第二种方式:
首先是一个基础类,和上面的方式一样
#!/usr/bin/env python
#-*-coding:utf-8-*-
from sgmllib import SGMLParser
import htmlentitydefs

class BaseHTMLProcessor(SGMLParser):
    def reset(self):                       
        # extend (called by SGMLParser.__init__)
        self.pieces = []
        SGMLParser.reset(self)
    
    #是一个开始一个块的 HTML 标记,象 <html>,<head>,<body> 或 <pre> 等,或是一个独一的标记,
    #象 <br> 或 <img> 等。当它找到一个开始标记 tagname,SGMLParser 将查找名为 start_tagname
    #或 do_tagname 的方法。例如,当它找到一个 <pre> 标记,它将查找一个 start_pre 或 do_pre 的方法。
    #如果找到了,SGMLParser 会使用这个标记的属性列表来调用这个方法;否则,它用这个标记的名字和属性
    #列表来调用 unknown_starttag 方法。
    def unknown_starttag(self, tag, attrs):
        # called for each start tag
        # attrs is a list of (attr, value) tuples
        # e.g. for <pre class="screen">, tag="pre", attrs=[("class", "screen")]
        # Ideally we would like to reconstruct original tag and attributes, but
        # we may end up quoting attribute values that weren't quoted in the source
        # document, or we may change the type of quotes around the attribute value
        # (single to double quotes).
        # Note that improperly embedded non-HTML code (like client-side Javascript)
        # may be parsed incorrectly by the ancestor, causing runtime script errors.
        # All non-HTML code must be enclosed in HTML comment tags (<!-- code -->)
        # to ensure that it will pass through this parser unaltered (in handle_comment).
        strattrs = "".join([' %s="%s"' % (key, value) for key, value in attrs])
        self.pieces.append("<%(tag)s%(strattrs)s>" % locals())
    
    #是结束一个块的 HTML 标记,象 </html>,</head>,</body> 或 </pre> 等。
    #当找到一个结束标记时,SGMLParser 将查找名为 end_tagname 的方法。如果找到,
    #SGMLParser 调用这个方法,否则它使用标记的名字来调用 unknown_endtag 。
    def unknown_endtag(self, tag):         
        # called for each end tag, e.g. for </pre>, tag will be "pre"
        # Reconstruct the original end tag.
        self.pieces.append("</%(tag)s>" % locals())
        
    #用字符的十进制或等同的十六进制来表示的转义字符,象 &#160;。当
    #找到,SGMLParser 使用十进制或等同的十六进制字符文本来调用 handle_charref 。
    def handle_charref(self, ref):         
        # called for each character reference, e.g. for "&#160;", ref will be "160"
        # Reconstruct the original character reference.
        self.pieces.append("&#%(ref)s;" % locals())

    #HTML 实体,象 &copy;。当找到,SGMLParser 使用 HTML 实体的名字来调用 handle_entityref 。
    def handle_entityref(self, ref):       
        # called for each entity reference, e.g. for "&copy;", ref will be "copy"
        # Reconstruct the original entity reference.
        self.pieces.append("&%(ref)s" % locals())
        # standard HTML entities are closed with a semicolon; other entities are not
        if htmlentitydefs.entitydefs.has_key(ref):
            self.pieces.append(";")

    #文本块。不满足其它 7 种类别的任何东西。当找到,SGMLParser 用文本来调用 handle_data。
    def handle_data(self, text):           
        # called for each block of plain text, i.e. outside of any tag and
        # not containing any character or entity references
        # Store the original text verbatim.
        #数据的处理
        self.pieces.append(text)
        
    #HTML 注释, 包括在 <!-- ... -->之间。当找到,SGMLParser 用注释内容来调用 handle_comment
    def handle_comment(self, text):        
        # called for each HTML comment, e.g. <!-- insert Javascript code here -->
        # Reconstruct the original comment.
        # It is especially important that the source document enclose client-side
        # code (like Javascript) within comments so it can pass through this
        # processor undisturbed; see comments in unknown_starttag for details.
        self.pieces.append("<!--%(text)s-->" % locals())

    #HTML 处理指令,包括在 <? ... > 之间。当找到,SGMLParser 用处理指令内容来调用 handle_pi。
    def handle_pi(self, text):             
        # called for each processing instruction, e.g. <?instruction>
        # Reconstruct original processing instruction.
        self.pieces.append("<?%(text)s>" % locals())

    #HTML 声明,如 DOCTYPE,包括在 <! ... >之间。当找到,SGMLParser 用声明内容来调用 handle_decl
    def handle_decl(self, text):
        # called for the DOCTYPE, if present, e.g.
        # <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        #     "http://www.w3.org/TR/html4/loose.dtd">
        # Reconstruct original DOCTYPE
        self.pieces.append("<!%(text)s>" % locals())

    def output(self):              
        """Return processed HTML as a single string"""
        return "".join(self.pieces)


接着第二种方法具体的应用,解析的是新浪一个特定blog的文章的内容和标题代码如下:
#!/usr/bin/env python
#coding:utf8
import re
from BaseHTMLProcessor import BaseHTMLProcessor
import urllib

class Dialectizer(BaseHTMLProcessor):
    subs = ()

    def reset(self):
        # extend (called from __init__ in ancestor)
        # Reset all data attributes
        self.verbatim = 0
        BaseHTMLProcessor.reset(self)

    def unknown_starttag(self, tag, attrs):
        self.pieces.append("")
        
    def unknown_endtag(self, tag):
        self.pieces.append("")
        
    def start_title(self, attrs):
        self.pieces.append("title")  
    
    def end_title(self): 
        self.pieces.append("title")
        
    def start_p(self, attrs):
        self.pieces.append("\n")  
    
    def end_p(self): 
        self.pieces.append("")
        
    def start_div(self, attrs):
        strattrs = "".join([value for key, value in attrs])
        self.pieces.append(strattrs)        
       
    
    def end_div(self):  
        self.pieces.append("div") 
    
    def handle_data(self, text):
        self.pieces.append(self.verbatim and text or self.process(text))

    def process(self, text):
        for fromPattern, toPattern in self.subs:
            text = re.sub(fromPattern, toPattern, text)
        return text


def translate(url):    
    import urllib                      
    sock = urllib.urlopen(url)         
    htmlSource = sock.read()           
    sock.close()                    
    parser = Dialectizer()
    #parser.subs=((r"&#26412;",r"aaa"),)
    parser.feed(htmlSource)#进行解析
    parser.close()         
    return parser.output() 

def test(url,filename):
    htmlSource=translate(url)
    #标题
    title=htmlSource[re.search("title",htmlSource).end():]
    title=title[:re.search("title",title).end()-5]
    #内容
    content=htmlSource[re.search("articleBody",htmlSource).end()+2:]
    content=content[:re.search("div",content).end()-3]
    content=re.sub("&nbsp;","",content)
    content=re.sub("nbsp;","",content)
    #文件名称
    fileName=title;
    #输出的文件内容
    fileContent=title+"\n\n\n"+content;    
    fsock = open(filename, "wb")
    fsock.write(fileContent)
    fsock.close()

if __name__ == "__main__":
    test("http://blog.sina.com.cn/s/blog_4bd7b9a20100cpgb.html",'test.txt')
    


分享到:
评论

相关推荐

    python解析url中关键字资料

    ### Python解析URL中关键字资料 #### 知识点概述 在Web开发与数据抓取过程中,经常需要对URL进行解析,以获取其中的关键字参数。本篇内容将围绕一段用于测试目的的URL集合,深入探讨如何使用Python语言来解析这些...

    PythonURL解析工具

    其他说明: 这个工具是一个基本示例,使用了 Python 内置的 `urllib.parse` 模块来解析URL。你可以根据需要扩展工具的功能,例如支持更多URL部分、提供更详细的解析信息或自定义输出格式。用户需要输入要解析的URL,...

    Python解析、提取url关键字的实例详解

    #### 三、Python解析URL的库 在Python中,解析URL主要依赖于标准库中的`urllib.parse`模块。对于Python 2版本,使用的是`urlparse`模块,而Python 3版本则使用`urllib.parse`。 - **Python 2**: ```python from ...

    Python-MarkdownMistune快速并且功能齐全的纯Python实现的Markdown解析

    而Mistune是Python社区中一个非常受欢迎的Markdown解析库,它提供了快速且功能丰富的纯Python实现。 **Markdown Mistune详解** 1. **安装与导入** 在Python环境中,你可以通过`pip`来安装Mistune库: ``` pip ...

    python解析百度文库获得pdf+word+ppt

    本话题聚焦于使用Python解析百度文库以下载PDF、Word和PPT文档。这涉及到网络爬虫技术,它允许我们从互联网上抓取所需信息。下面我们将深入探讨这个主题。 首先,我们需要了解Python中的几个关键库,它们对于实现这...

    python 获取url中的参数列表实例

    Python的urlparse有对url的解析,从而获得url中的参数列表 import urlparse urldata = "http://en.wikipedia.org/w/api.php?action=query&ctitle=FA" result = urlparse.urlparse(urldata) print result print ...

    python对url格式解析的方法

    本文实例讲述了python对url格式解析的方法。分享给大家供大家参考。具体分析如下: python针对url格式的解析,可根据指定的完整URL解析出url地址的各个部分 from urlparse import urlparse url_str = ...

    Python3解析BT种子.zip

    在本资源"Python3解析BT种子.zip"中,我们聚焦于如何利用Python3来解析BT(BitTorrent)种子文件,这是一种用于分布式文件分享的技术。BT种子文件通常具有.torrent的扩展名,包含有关文件分发的所有必要元数据。 BT...

    Python-jparser一个强大的python解析器可以从HTML页面中提取标题内容图像

    Python-jparser是一个专门为Python开发者设计的强大工具,它作为一个高效的HTML解析器,可以帮助用户从HTML页面中提取出关键的内容,如标题、文本段落以及图像。这个库特别适用于处理新闻资讯类网页,因为它的核心...

    Python资源之URL和DNS

    urllib.parse 是 Python 的标准库之一,用于解析 URL。它可以将 URL 字符串分解成不同的组件,例如协议、网络位置、路径等,并将相对 URL 转换为绝对 URL。urllib.parse 是处理 URL 的 Swiss Army Knife,提供了许多...

    Python如何实现转换URL详解

    本文将深入探讨如何使用Python解析URL并将其拆分为五个关键部分:schema(协议),netloc(网络位置),path(路径),query_params(查询参数)和fragment(片段标识)。我们将通过两个不同的方法来实现这一目标:...

    python写的torrent解析库pytorrent

    Python编写的`pytorrent`库是一个用于解析BitTorrent协议的工具,它允许开发者处理.torrent文件,理解其中包含的信息,并能进行相关操作。这个库对于那些想要构建与BitTorrent相关的应用,如种子下载器或者Tracker...

    Python-Hamburglar从URL目录和文件中收集有用信息的Python脚本

    Python-Hamburglar是一款实用的工具,它以Python编程语言为基础,设计用于从URL、目录以及文件中抓取和分析有用的信息。这个脚本是开发者、安全研究人员和网络管理员的得力助手,它可以帮助他们快速地获取网站或...

    Python-JSParser使用Tornado和JSBeautifier解析JavaScript文件中相对URL的python27脚本

    Python-JSParser是一个基于Python 2.7的实用工具,专为安全研究人员和Bug赏金猎人设计,用于解析JavaScript文件中的相对URL。这个工具利用了Tornado和JSBeautifier两个库,来帮助用户在处理JavaScript源代码时,有效...

    adblockparser, 用于Adblock加滤波器的python 解析器.zip

    adblockparser, 用于Adblock加滤波器的python 解析器 adblockparser adblockparser 是一个用于处理 Adblock加过滤规则的软件包。 它可以解析Adblock加过滤器和 MATCH url 。安装pip install adblock

    python实现批量将域名解析成ip

    批量将域名转成ip,为了避免误差,该工具同时使用dig工具和python自带的gethostbyname_ex工具解析域名,并且最大化的收集所有ip。 如果使用windows需要安装dig工具(mac或者linux忽略)。 安装教程:...

Global site tag (gtag.js) - Google Analytics