0

別の IP アドレスから自分の Web サイトをテストできるように、簡単な Python スクリプトを作成しています。

ページの URL はクエリ文字列で指定され、スクリプトはページを取得してユーザーに表示します。以下のコードは、URL を含むタグを書き直すために使用されますが、完全ではないと思います。

def rel2abs(rel_url, base=loc):
    return urlparse.urljoin(base, rel_url)

def is_proxy_else_abs(tag, attr):
    if tag in ('a',):
        return True
    if tag in ('form', 'img', 'link') and attr in ('href', 'src', 'action', 'background'):
        return False

def repl(matchobj):
    if is_proxy_else_abs(matchobj.group(1).lower(), matchobj.group(3).lower()):
        return r'<%s %s %s="http://%s?%s" ' %(proxy_script_url, matchobj.group(1), matchobj.group(2), matchobj.group(3), urllib.urlencode({'loc':rel2abs(matchobj.group(5))}))
    else:
        return r'<%s %s %s="%s" ' %(matchobj.group(1), matchobj.group(2), matchobj.group(3), rel2abs(matchobj.group(5)))

def fix_urls(page):
    get_link_re = re.compile(r"""<(a|form|img|link) ([^>]*?)(href|src|action|background)\s*=\s*("|'?)([^>]*?)\4""", re.I|re.DOTALL)
    page = get_link_re.sub(repl, page)
    return page

「a」タグの href 属性はプロキシ スクリプトを介してルーティングする必要がありますが、css、javascript、画像、フォームなどはそうすべきではないため、元のページで相対的な場合は絶対にする必要があります。

問題は、コードが常に機能するとは限らないこと、css はさまざまな方法で記述できることなどです。使用できるより包括的な正規表現はありますか?

4

1 に答える 1

3

HTMLの解析については、こちらの他の投稿をお読みください。たとえば、Python解析用のPython正規表現(BeautifulSoup)PythonのHTMLパーサー

正規表現ではなく、BeautifulSoupを使用してください。

于 2008-12-29T20:09:34.070 に答える