精华内容
下载资源
问答
  • Python3 HTML 解析器

    千次阅读 2011-11-22 14:17:31
    作为爬虫比较重要的一部分HTML解析器Python3 自己有一个,使用了一下,还不是很好用 第三方的有:  目前还不支持Python3 , Python3 的资料还不是很多  BeautifulSoup -- 支持版本2.x 很不错,我不想退版本...

    作为爬虫比较重要的一部分HTML解析器:

    Python3 自己有一个,使用了一下,还不是很好用

    第三方的有:

     目前还不支持Python3 , Python3 的资料还不是很多

     BeautifulSoup -- 支持版本2.x 很不错,我不想退版本,以后他有了我再用

    Chilkat Spider component -==-- 专门支持爬虫的库, 看了一下还行,


    使用库,失去的这个项目原有的初衷,所以放弃把,

    剩下的就是慢慢的分析包结构和逻辑了

    急需努力把

    本周末发布c# 第一个版本 给予2的升级

    Python 2版本,打算重写, 不用过去的升级 

    希望这轮的升级可以对Python有一个新的认识


    ###解析超文本这个思路过于难,以后在考虑

    ###目前没有好用的库
    from html.parser import HTMLParser


    class MyHTMLParser(HTMLParser):
        def handle_starttag(self, tag, attrs):
            #print("Encountered a {} 测试".format(tag))
            #print(format(attrs))


            #当前资源田的级别和位置连接
            # if tag=='area':
            #     print("Encountered a {} start tag".format(tag))
            #     #print(format(attrs))


            # if tag == 'res':
            #     print(format(attrs))


            # if tag == 'tbody':
            #     print(format(tag))
            #     print(format(attrs))


            if tag == 'l1':
                print(format(tag))
                print(format(attrs))


            #每小时产量
            if tag == 'li':
                print(format(tag))
                print(format(attrs))
           
        def handle_endtag(self, tag):
            if tag=='area':
                print("Encountered a {} end tag".format(tag))            
            if tag == 'res':
                print(format(attrs))


    #1 page = """<html><h1>Title</h1><p>I'm a paragraph!</p></html>"""


    #2-==============test code start======================--
    file=open('temp.html',encoding='utf-8')
    p=file.read()
    #2 test code end-=====================================--


    myparser = MyHTMLParser()
    myparser.feed(p)
    展开全文
  • Python的xml/html解析器选择

    千次阅读 2014-05-01 15:15:58
    其实比较不同的解析器html的处理能力是有点麻烦的,因为它们处理的步骤并不完全相同的: 1. 解析HTML:能读入 2. 解析为某个对象:能处理 3. 序列化:能输出 各个解析器做的可能是三件事中的某部分。基本上...

    其实比较不同的解析器对html的处理能力是有点麻烦的,因为它们处理的步骤并不完全相同的:

    1. 解析HTML:能读入
    2. 解析为某个对象:能处理
    3. 序列化:能输出
    各个解析器做的可能是三件事中的某部分。基本上常见的解析器调查一下:

    lxml: 三样都干,而且还可以使用参数指定其他几种解析器。

    BeautifulSoup: 三样都干。

    html5lib: 可以解析,但是它的序列化和对象化就做的一般。

    ElementTree: 对象化和序列化xml,html支持一般,同时它不具备解析功能,所以通常是用html5lib把文档解析后交给它。

    cElementTree: 作为c扩展的一个对象化库。

    HTMLParser: 有名的解析库。但不能生成任何结果树。

    htmlfill: 这个库实际上使用了HTMLParser,不过在解析的时候把解析后的结果稍微结构化了一下。

    Genshi: 三样都干。

    xml.dom.minidom: 对象化的库,可以把html5lib的解析结果作为输入。这个是python内置的库,但是,相信本座,不用它为好。

    在实际做的时候,本座重点考察了lxml,因为它是基于c的libxml2库的,想必速度会很快。看它官网上的结论,也是很漂亮。不过官网都是自说自话,当然不能全信,因此本座也有做自己的测试。

    测试使用的基准文件是Java JDK的Docs(懒得找别的了)。代码就不贴了,反正就是解析。图片是用google的chart api来生成的,大概的代码如下:

    def make_chart(data, size_x=400, size_y=None, graph_type='bhs', name_format='%(name)s'):
        url = 'http://chart.apis.google.com/chart?'
        params = {}
        if size_y is None:
            size_y = len(data)*30
        params['chs'] = '%sx%s' % (size_x, size_y)
        numbers = [number for name, number in data]
        params['chd'] = 'e:' + ''.join(list(encode_numbers(numbers)))
        names = [name_format % dict(name=name, number=number) for name, number in data]
        params['chxl'] = '0:|%s|' % '|'.join(reversed(names))
        params['chxt'] = 'y'
        params['cht'] = graph_type
        return url + urllib.urlencode(params)
     
    digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.'
    其中的encode_numbers主要是用来做输入数据的scale:
    
    def encode_numbers(numbers, lowest=0):
        """
        Encodes numbers over the range of 0-4095
        """
        if lowest is None:
            lowest = min(numbers)
        highest = max(numbers)
        range = highest-lowest
        for number in numbers:
            adjusted = int((number - lowest) * 4095 / range)
            assert adjusted >= 0 and adjusted <= 4095, 'Out of range: %r' % adjusted
            yield digits[adjusted / 64] + digits[adjusted % 64]


    解析

    可以看到,lxml居然是最快的,比HTMLParser的速度都快(要知道后面这个老兄可是别的什么都不做),原因可能是lxml在内存中生成了一棵树吧。 xml.dom.minidom是慢到龟速了,Genshi算是速度不错的,但是也是所有解析器中最容易出错的。相对而言,html5lib、lxml和BeautifulSoup是最稳定的。尤其是html5lib,可以(从理论上而言)保证解析的鲁棒性。

    序列化

    虽然lxml又像博尔特一样跑在前面,但是我们可以看到对绝大多数包而言序列化都不算是费时的活。同时,minidom有一次垫底,这下你知道本座为什么叫你不要考虑用它了吧。

    结论

    由于源于c,实验之前本座也猜想lxml会是更快的那位,但是没有想到它有这么快。后续可能的话,应该再对内存占用率做一个比较。但由于调用的大都是c而不是python来完成运行,相信比较的结果也会比较乐观。因此,本座在后面的博客搬家以及将来一切与xml/html解析相关的工作就交给它了。

    这次实验还有一个结论。长期以来,对xml/html的解析,把文件作为一个输入流而不是对象的方式读入一直被认为是最佳方案。拍拍脑袋我们大概可以想象,不断由事件驱动读入token会比在内存中储存整个对象树要。HTMLParser 和Genshi 等解析器都是采用的这种方式。不过通过这次实验我们可以看到,只要我们处理的不是数个G的怪物文件,用持有对象的lxml和ElementTree这样的库其实是更好的选择,因为对对象的处理总是比数据流来得自然很多。即使你真的有非常奇怪的需求,需要处理超大的文件,lxml也有参数可供选择。


    —————————————————————————————————

    本文原创自Sliencecsdn技术博客。

    本博客所有原创文章请以链接形式注明出处。

    欢迎关注本技术博客,本博客的文章会不定期更新。


    大多数人想要改造这个世界,但却罕有人想改造自己。

    世上没有绝望的处境,只有对处境绝望的人。

                                                  ————By slience

    —————————————————————————————————


    展开全文
  • python HTML解析器

    千次阅读 2012-12-31 19:35:29
    一般的爬虫解析 html 用 sgmlib 或者 lxml 解析  lxml 解析速度是 BS 的 20 倍以上 http://www.crummy.com/software/BeautifulSoup/bs4/doc/
    一般的爬虫解析 html 用  sgmlib 或者 lxml 解析 
    lxml 解析速度是 BS 的 20 倍以上
    展开全文
  • Python 文本解析器

    千次阅读 2018-08-06 14:22:10
    讲解一个使用 Python解析纯文本生成一个 HTML 页面的小程序。 将学习和实践以下知识点: Python 基本语法 HTML 标记语言 1.2 实验知识点 Python:一种面向对象、解释型计算机程序设计语言,用它可以做 Web ...

    一、实验介绍

    • 1.1 实验内容
      讲解一个使用 Python 来解析纯文本生成一个 HTML 页面的小程序。
      将学习和实践以下知识点:
      Python 基本语法
      HTML 标记语言

    • 1.2 实验知识点
      Python:一种面向对象、解释型计算机程序设计语言,用它可以做 Web 开发、图形处理、文本处理和数学处理等等。
      HTML:超文本标记语言,主要用来实现网页。

    • 1.3 实验环境
      Python 3.6.5
      pychram

    • 1.4 实验结果
      纯文本文件:

    冰灯
    
    冰灯是流行于中国北方的一种民间艺术,也是冰雕艺术的一种形式。
    
    -1 简介
    
    -2 起源
    
    -3 发展及现状
    
    -4 冰雕
    
    -5 参见

    解析后生成的 HTML 页面如下图

    这里写图片描述

    二、项目文件结构

    本项目中将创建以下的代码文件,每个文件的作用简介如下:

    util.py:实现文本块生成器把纯文本分成一个一个的文本块,以便接下来对每一个文本块进行解析
    handlers.py:为文本块打上合适的 HTML 标记
    rules.py:设计一定的规则来判断每个文本块交给处理程序将要加什么标记
    markup.py:对整个文本进行解析的程序

    三、实验步骤

    一共有文本块生成器、处理程序、规则、解析和运行与测试五个步骤。

    3.1 文本块生成器

    首先我们需要有一个文本块生成器把纯文本分成一个一个的文本块,以便接下来对每一个文本块进行解析,util.py 代码如下:

    #!/usr/bin/python
    # encoding: utf-8
    
    def lines(file):
        """
        生成器,在文本最后加一空行
        """
        for line in file: yield line
        yield '\n'
    
    def blocks(file):
        """
        生成器,生成单独的文本块
        """
        block = []
        for line in lines(file):
            if line.strip():
                block.append(line)
            elif block:
                yield ''.join(block).strip()
                block = []

    strip() 函数可以去除一个字符串前后的空格以及换行符,如果在strip()函数添加不同的参数,如strip(“me”),则可以去除字符串前后的”me”字符。

    s = ” This is me\n”
    s = s.strip()
    s
    ‘This is me’
    s = s.strip(“me”)
    s
    ‘This is ‘

    yield()会返回一个生成器(generator)。如果对generator以及对 yiels 语句不太熟悉,建议先阅读yield解释(https://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html)。

    3.2 处理程序

    假设我们已经知道一个文本块是 title/paragraph/heading/list,我们通过 handlers.py 给他们打上合适的 HTML 标记。代码如下:

    '''对整个文本进行解析的程序'''
    #!/usr/bin/python
    # encoding: utf-8
    
    import sys, re
    from handlers import *
    from util import *
    from rules import *
    
    class Parser:
        """
        解析器父类
        """
        def __init__(self, handler):
            self.handler = handler
            self.rules = []
            self.filters = []
    
        def addRule(self, rule):
            """
            添加规则
            """
            self.rules.append(rule)
    
        def addFilter(self, pattern, name):
            """
            添加过滤器
            """
            def filter(block, handler):
                return re.sub(pattern, handler.sub(name), block)
            self.filters.append(filter)
    
        def parse(self, file):
            """
            解析
            """
            self.handler.start('document')
            for block in blocks(file):
                for filter in self.filters:
                    block = filter(block, self.handler)
                for rule in self.rules:
                    if rule.condition(block):
                        last = rule.action(block, self.handler)
                        if last: break
            self.handler.end('document')
    
    class BasicTextParser(Parser):
        """
        纯文本解析器
        """
        def __init__(self, handler):
            Parser.__init__(self, handler)
            self.addRule(ListRule())
            self.addRule(ListItemRule())
            self.addRule(TitleRule())
            self.addRule(HeadingRule())
            self.addRule(ParagraphRule())
    
            self.addFilter(r'\*(.+?)\*', 'emphasis')
            self.addFilter(r'(http://[\.a-zA-Z/]+)', 'url')
            self.addFilter(r'([\.a-zA-Z]+@[\.a-zA-Z]+[a-zA-Z]+)', 'mail')
    
    """
    运行程序
    """
    handler = HTMLRenderer()
    parser = BasicTextParser(handler)
    parser.parse(sys.stdin)

    在上面的代码中 callable() 函数能够检查一个函数是否能够被调用。如果能够被调用返回True。

    gerattr()函数则是返回一个对象的属性值。举例来说,getattr(x, ‘foo’, None) 就相当于是 x.foo,而如果没有这个属性值foobar,则返回我们设定的默认值None。

    3.3 规则

    有了处理程序和文本块生成器,接下来就需要一定的规则来判断每个文本块交给处理程序将要加什么标记,rules.py 代码如下:

    '''设计一定的规则来判断每个文本块交给处理程序将要加什么标记'''
    #!/usr/bin/python
    # encoding: utf-8
    
    class Rule:
        """
        规则父类
        """
        def action(self, block, handler):
            """
            加标记
            """
            handler.start(self.type)
            handler.feed(block)
            handler.end(self.type)
            return True
    
    class HeadingRule(Rule):
        """
        一号标题规则
        """
        type = 'heading'
        def condition(self, block):
            """
            判断文本块是否符合规则
            """
            return not '\n' in block and len(block) <= 70 and not block[-1] == ':'
    
    class TitleRule(HeadingRule):
        """
        二号标题规则
        """
        type = 'title'
        first = True
    
        def condition(self, block):
            if not self.first: return False
            self.first = False
            return HeadingRule.condition(self, block)
    
    class ListItemRule(Rule):
        """
        列表项规则
        """
        type = 'listitem'
        def condition(self, block):
            return block[0] == '-'
    
        def action(self, block, handler):
            handler.start(self.type)
            handler.feed(block[1:].strip())
            handler.end(self.type)
            return True
    
    class ListRule(ListItemRule):
        """
        列表规则
        """
        type = 'list'
        inside = False
        def condition(self, block):
            return True
    
        def action(self, block, handler):
            if not self.inside and ListItemRule.condition(self, block):
                handler.start(self.type)
                self.inside = True
            elif self.inside and not ListItemRule.condition(self, block):
                handler.end(self.type)
                self.inside = False
            return False
    
    class ParagraphRule(Rule):
        """
        段落规则
        """
        type = 'paragraph'
    
        def condition(self, block):
            return True

    3.4 解析
    当我们知道每一个文本块进行怎么样的处理,交给谁去处理之后,我们就可以对整个文本进行解析了,markup.py 代码如下:

    '''对整个文本进行解析的程序'''
    #!/usr/bin/python
    # encoding: utf-8
    
    import sys, re
    from handlers import *
    from util import *
    from rules import *
    
    class Parser:
        """
        解析器父类
        """
        def __init__(self, handler):
            self.handler = handler
            self.rules = []
            self.filters = []
    
        def addRule(self, rule):
            """
            添加规则
            """
            self.rules.append(rule)
    
        def addFilter(self, pattern, name):
            """
            添加过滤器
            """
            def filter(block, handler):
                return re.sub(pattern, handler.sub(name), block)
            self.filters.append(filter)
    
        def parse(self, file):
            """
            解析
            """
            self.handler.start('document')
            for block in blocks(file):
                for filter in self.filters:
                    block = filter(block, self.handler)
                for rule in self.rules:
                    if rule.condition(block):
                        last = rule.action(block, self.handler)
                        if last: break
            self.handler.end('document')
    
    class BasicTextParser(Parser):
        """
        纯文本解析器
        """
        def __init__(self, handler):
            Parser.__init__(self, handler)
            self.addRule(ListRule())
            self.addRule(ListItemRule())
            self.addRule(TitleRule())
            self.addRule(HeadingRule())
            self.addRule(ParagraphRule())
    
            self.addFilter(r'\*(.+?)\*', 'emphasis')
            self.addFilter(r'(http://[\.a-zA-Z/]+)', 'url')
            self.addFilter(r'([\.a-zA-Z]+@[\.a-zA-Z]+[a-zA-Z]+)', 'mail')
    
    """
    运行程序
    """
    handler = HTMLRenderer()
    parser = BasicTextParser(handler)
    parser.parse(sys.stdin)

    3.5 运行与测试

    运行程序(纯文本文件为 test.txt,生成 HTML 文件为 test.html):

    python markup.py < test.txt > test.html

    获得 test.html 文件之后,我们想在浏览器中看一下我们的文本解释效果。

    这里写图片描述

    相关文件以及源码下载:https://download.csdn.net/download/jia666666/10586143
    展开全文
  • [Python]HTML/XML解析器Beautiful Soup

    千次阅读 2014-12-20 22:56:51
    HTML/XMLX的解析器。 它可以很好的处理不规范标记并生成剖析树(parse tree)。 它提供简单又常用的导航(navigating),搜索以及修改剖析树的操作。它可以大大节省你的编程时间。 【安装】 下载地址:点击打开...
  • Python 解析器

    千次阅读 2018-01-16 16:44:16
    python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。 2.DOM(Document Object Model) 将XML数据在内存中解析成一个树,通过对...
  • BeautifulSoup号称Python中最受欢迎的HTML解析库之一,但是这并不是唯一的选择。BeautifulSoup(markup,"html.parser") 优点python自身带有 速度比较快 能较好兼容 (as of Python 2.7.3 and 3.2.)缺点不...
  • Pythonhtml解析(BeautifulSoup)

    万次阅读 2020-11-05 16:57:54
    BeautifulSoup支持不同的解析器,比如,对HTML解析,对XML解析,对HTML5解析。一般情况下,我们用的比较多的是 lxml 解析器。 BeautifulSoup安装  BeautifulSoup3 目前已经停止更新,推荐在现在的项目中使用...
  • 设置Python解析器

    2019-05-16 15:00:00
    如果某些特殊原因(比如有些框架只能在Python2.7中使用),需要修改程序在 Python2.7 下运行,即可设置Python解析器Python2.7。 在菜单栏中依次选择 File → Setting → Project : go big(这里是项目名称) → ...
  • python网页解析器

    2018-01-27 09:50:33
    python的网页解析器; 正则表达式 html.parser Beautiful Soup(可以使用html.parser 和lxml两种解析器) lxml 步骤:未测试from bs4 import BeautifulSoup #导入模块 def htmlget(great):  with open(great) ...
  • Python数据采集之网页解析器

    千次阅读 2017-05-04 19:19:09
    1.Python网页解析器1.1网页解析器简介网页解析器HTML网页中提取出“有价值数据”或“新URL链接”的工具。网页解析流程如下图所示:1.2 Python网页解析器常见的Python网页解析器主要有正则表达式(re)、Python自带...
  • Requests-HTML解析HTML的Python

    千次阅读 2018-03-05 15:44:04
    HTML Parsing for Humans, 这句话是库作者(kennethreitz...需要提示一下:目前requests-html只支持python3.6及以上版本。首先需要安装此模块pip install requests-html获取首页:&gt;&gt;&gt; fromreques...
  • python的一个html解析器 Beautiful Soup

    千次阅读 2014-05-22 23:00:07
    python世界里,并没有像php一样,封装很好很详细的函数,比如随手可用的array_diff,strip_tags,parse_url,一切都要重新造轮子,或者新安装插件。...和我之前用的htmldom一样,都是python世界常用的html解析库。
  • 使用Python语言编写简单的HTML5语法解析器 摘要:通过使用Python语言编写一个简单的HTML5语法解析器作为例子,探讨了在设计手写的递归下降语法解析器程序时需要注意的一些事项。   关键字:PythonHTML5语法解析器 ...
  • python安装解析器html5lib

    千次阅读 2018-08-04 10:25:17
    在命令行执行前,先配置好环境变量。然后执行语句 pip install html5lib  执行结果如图所示,即表示安装成功
  • 一般用xlml 但遇到过解析出来的内容不一样。有误 用另一种方法得到正确的,有误应该只是极少问题。这种方案备用 html = browser.page_source htm = bs(html,'html.parser') ...
  • BeautifulSoup号称Python中最受欢迎的HTML解析库之一,但是这并不是唯一的选择。解析库lxml这个库可以用来解析HTML和XML文档,以非常底层的实现而闻名,大部分源码都是C语言写的,虽然学习这东西要花一定的时间,...
  • Python 用BeautifulSoup 解析Html

    千次阅读 2017-07-29 21:15:32
    1. 安装Beautifulsoup4pip install beautifulsoup4 ...pip install html5liblxml 和 html5lib 是解析器2. html The Website Title Download my Python book from my website. Learn Python the easy way! B
  • python爬虫(五)网页解析器

    千次阅读 2018-07-19 15:19:37
    python 有四种网页解析器: 1 正则表达式:模糊匹配解析 2 html.parser:结构化解析 3 Beautiful Soup :结构化解析 4 lxml:结构化解析 其中 Beautiful Soup 功能很强大,有html.parse和 lxml的解析器. 结构化解析-...
  • python 参数解析器metavar

    千次阅读 2019-10-16 15:26:17
    元变量: 它为帮助消息中的可选参数提供了不同的名称。在add_argument()中为metavar关键字参数提供一个...https://stackoverflow.com/questions/19124304/what-does-metavar-and-action-mean-in-argparse-in-python
  • python爬虫五大解析器

    千次阅读 2018-10-28 14:44:59
    python有五大解析器 一、正则表达式 ,使用第三方库 re(re) 1.匹配规则有 模式 描述 \w 匹配字母、数字及下划线 \W 匹配不是字母、数字及下划线的...
  • Pythonhtml解析BeautifulSoup

    千次阅读 2017-06-09 17:15:48
    转自:... 【Pythonhtml解析BeautifulSoup BeautifulSoup  bs是个html解析模块,常用来做爬虫?  ■ 安装  BeautifulSoup可以通过pip来安装,用pip install beautifulsoup4 即
  • 该模块定义了一个HTMLParse类作为解析格式化的文本文件HTML(超文本标记语言)和XHTML的基础。不像htmllib的解析器,这个解析器不基于sgmllib模块的SGML解析器
  • 解析器 : html5lib 安装 : pip install html5lib 使用方法 : BeautifulSoup(markup, "html5lib") 优势 : 最好的容错性 优势 : 以浏览器的方式解析文档 优势 : 生成HTML5格式的文档 劣势 : 速度慢 劣势 : 不依赖外部...
  • 1. 安装解析库 Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml .根据操作系统不同,可以选择下列方法来安装lxml:$ apt-get install Python-lxml$ easy_install ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 94,295
精华内容 37,718
关键字:

html解析器python

python 订阅