【问题标题】:Parsing python source into html - quotes将 python 源代码解析为 html - 引号
【发布时间】:2012-09-17 22:22:15
【问题描述】:

我正在开发一种工具,可以将 python 源代码解析为一个漂亮的 html 文件。基本上,它逐行读取python文件,查看该行以确定其中的内容,然后添加正确的<span>标签,包括颜色、换行符等等。

我得到了程序的一般结构,现在我正在制作实际读取字符串并返回 HTML 丰富字符串的所有函数。

我一直在解析带有引号的字符串,即:

x = 'hello there'  
if x == 'example "quotes" inside quotes' and y == 'another example':    

到目前为止,我的工作一直是枚举一个字符串以获取单引号的索引,将它们作为一个列表返回,然后是两个将正确的 html 标记放在正确位置的 while 循环。当字符串中有一个单引号时,它似乎工作得很好,但是当我在一行中引入两个引号时,或者在引号内引入引号,或者最后 - 一个由“\”组成的字符串时,一切都崩溃了。

看来这条路走不通了。我现在正在考虑转向 .split()shlexre 并将字符串分解为一个列表并尝试使用它。
我真的很感激提示、指示和任何建议。

编辑:另外,为了更清楚,我需要将 HTML 标记放在字符串中的正确位置。使用字符串索引并没有对更复杂的字符串产生太多结果。

【问题讨论】:

    标签: python html string parsing


    【解决方案1】:

    你可以使用tokenize.generate_tokens:

    import tokenize
    import token
    import io
    
    text = '''
    x = 'hello there'  
    if x == 'example "quotes" inside quotes' and y == 'another example': pass
    '''
    
    
    tokens = tokenize.generate_tokens(io.BytesIO(text).readline)
    for toknum, tokval, (srow, scol), (erow, ecol), line in tokens:
        tokname = token.tok_name[toknum]
        print(tokname, tokval)
    

    产量

    ('NL', '\n')
    ('NAME', 'x')
    ('OP', '=')
    ('STRING', "'hello there'")
    ('NEWLINE', '\n')
    ('NAME', 'if')
    ('NAME', 'x')
    ('OP', '==')
    ('STRING', '\'example "quotes" inside quotes\'')
    ('NAME', 'and')
    ('NAME', 'y')
    ('OP', '==')
    ('STRING', "'another example'")
    ('OP', ':')
    ('NAME', 'pass')
    ('NEWLINE', '\n')
    ('ENDMARKER', '')
    

    从这里,您可以根据每个令牌的类型 (tokname) 输出适当的 HTML。

    【讨论】:

    • 非常感谢!我觉得很无知。我在 IDLE 中玩这个,这是完美的解决方案。
    • 我知道这可能是一个愚蠢的问题,但你为什么使用 .readline 而不是 readline() ?这不是从 BytesIO 对象调用一个名为 readline 的变量,而不是 readline() 函数吗?我知道它有效,我只是对其进行了测试,但我很好奇 为什么 它有效。再次感谢!
    • generate_tokens doc 表示它的参数应该有一个readline 方法。通常这可能是一个文件对象,但由于我使用的是字符串,因此我将其包装在 BytesIO 中,因为它也有 readline 方法。不带括号的readline 指的是方法本身。将readline() 放在那里会过早地调用该方法,返回一个字符串,并将其作为参数提交给generate_tokens。那不是我们想要的。我们想要方法本身。
    • 哇,感谢您的快速答复。我从中学到了很多东西,我必须把头绕过去,它很迷人。再次感谢!
    【解决方案2】:

    Colorize Python source using the built-in tokenizer 是此类代码的一个示例(使用cgi.escape)。看看它是否符合您的需求!

    【讨论】:

      【解决方案3】:

      像 cgi.escape 这样的东西可能是你想要的。还有像 BeautifulSoup 和 Pygments 这样的工具,它们的功能与您正在制作的东西非常相似,您可能想利用它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-22
        • 2019-09-22
        • 1970-01-01
        • 2012-04-30
        • 2018-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多