1

httpプロキシプロジェクトがあります。すべてのアクションとhrefをこれに変更するために使用する書き換えルールがいくつかあります/follow/+URL。また、すべてのsrcのURLをこれ/proxy/+URLに変更します。これは、リンクと画像などの間にURLを割り当てるのに役立ちます。<img>ただし、タグでも問題なく動作します。私が抱えている問題は<iframe src=...>タグにあります。コードを適用すると、srcが'/ proxy / + URL'に変更されますが、変更したいの/follow/+URLですが、どうすればよいかわかりません。

これが私のコードです

from urlparse import urlparse, urlunparse
import re, urllib


REWRITE_LINKS = re.compile(r'((?P<attr>action|href|src)=["\'](?P<uri>\S+?)["\'])', re.IGNORECASE)


def rewrite_links(content, mimetype = '', uri = ''):
    uri = str(uri)
    urip = urlparse(uri)
    server_root = str(urlunparse((urip[0], urip[1], '/', '', '', '')))

    working_dir = str(urlunparse((urip[0], urip[1], urip[2], '/', '', '')))
    working_dir = '/'.join(working_dir.split('/')[:-1])

    def repl_html(match):
        attr, value = match.groupdict()['attr'], match.groupdict()['uri']

        if value in ('',) or value.startswith('javascript:') or value.startswith('#'):
            pass
        else:
            if value.find('://') == -1:
                if value.startswith('./'):
                    value = working_dir + value[2:]
                elif value.startswith('../'):
                    value = '/'.join(working_dir.split('/')[:-1]) + value[3:]
                elif value.startswith('/'):
                    value = server_root + value[1:]
                else:
                    value = server_root + value
            #value = value.replace('/','|')
            if attr.lower() == 'src':
                value = '/proxy/' + value
            else:
                value = '/follow/' + value

        return ' %s="%s" ' % (attr, value)

    if mimetype.startswith('text/html'):
        content = REWRITE_LINKS.sub(repl_html, content)
    elif mimetype.startswith('text/css'):
        pass
    elif mimetype.startswith('application/x-javascript'):
        pass
    else:
        pass

    return content

何かアドバイスはありますか?

4

1 に答える 1

1

名前付きグループを追加してみてください。

<(?P<tagname>[^\s]+)\s[^>]*

このようなREWRITE_LINKS行に:

REWRITE_LINKS = re.compile(r'(<(?P<tagname>[^\s]+)\s[^>]*(?P<attr>action|href|src)=["\'](?P<uri>\S+?)["\'])', re.IGNORECASE)

if attr.lower() == 'src':次に、条件ステートメントでこの一致を照会できます

于 2012-11-21T11:16:58.047 に答える