2

css ファイルからすべての画像 (.jpg、.png、.gif) uri を抽出しようとしています。

サンプルCSS

.blockpricecont{width:660px;height:75px;background:url('../images/postBack.jpg') 
repeat-x;/*background:url('../images/tabdata.jpg') repeat-x;*/border: 1px solid #B7B7B7;

使用される正規表現 -

  images = re.compile("(?:\()(?:'|\")?(.*\.jpg('?))", flags=re.IGNORECASE)

問題は、コメント付きのコード (/* ---- */) を含む css クラスがほとんどなく、これらのコメントに .jpg 参照が含まれていることです。上記の正規表現で得られる出力は

output
 ["../images/postBack.jpg') repeat-x;/*background:url('../images/tabdata.jpg'"]

expected output:
 ["../images/postBack.jpg"]

.jpg の最初の一致で正規表現を停止したいのですが、行末まで継続します。

前もって感謝します。

4

4 に答える 4

4

最も簡単な方法は、一致する前にコメントを削除することです。

css = re.sub(r'(?s)/\*.*\*/', '', css)

ただし、専用のパーサーを使用する方がよいという Matthew の意見には同意します。tinycssの例を次に示します。

import tinycss

def urls_from_css(css):
    parser = tinycss.make_parser()
    for r in parser.parse_stylesheet(css).rules:
        for d in r.declarations:
            for tok in d.value:
                if tok.type == 'URI':
                    yield tok.value

for url in urls_from_css(css):
    print url
于 2012-09-21T16:33:19.547 に答える
4
print re.findall('url\(([^)]+)\)',target_text)

私はそれがうまくいくはずだと思う

于 2012-09-21T16:28:26.040 に答える
1

おそらく、この方法では、最初に re.sub でコメントを削除してから、良いものを re.findall します。

example_css = """.blockpricecont{width:660px;height:75px;background:url('../images/postBack.jpg') 
repeat-x;/*background:url('../images/tabdata.jpg') repeat-x;*/border: 1px solid #B7B7B7;"""


import re

css_comments_removed = re.sub(r'\/\*.*?\*\/', '', example_css)

pattern = re.compile(r"(\'.*?\.[a-z]{3}\')")
matches = pattern.findall(css_comments_removed)
for i in matches:
    print(i)

版画

'../images/postBack.jpg'
于 2012-09-21T16:46:48.523 に答える
0

これはおそらく css パーサーに適しています。私はそれを使用していませんが、これが推奨されているのを見たことがあります。

于 2012-09-21T16:26:40.727 に答える