0

以下に示すような HTML ファイルがあるとします。

    </pre>
    <pre><img src="/icons/blank.gif" alt="Icon "> <a href="?C=N;O=D">Name</a>
    <img src="/icons/unknown.gif" alt="[   ]"> <a href="AAAAAAA.jpg">AAAAAAA.jpg</a>          16-Jan-2008 01:27  827K  
    <img src="/icons/unknown.gif" alt="[   ]"> <a href="AAAAAAA.jpg.xml">AAAAAAA.jpg.xml</a>      16-Jan-2008 01:28   12K
    <img src="/icons/image2.gif" alt="[IMG]"> <a href="BBBBB.AAAAAAAA.txt">BBBBB.AAAAAAAA.txt</a> 16-Jan-2008 15:01  1.6K  
    <img src="/icons/unknown.gif" alt="[   ]"> <a href="js421254.jpg">AAAAAAA.jpg</a>          16-Jan-2008 01:27  827K  
    <img src="/icons/unknown.gif" alt="[   ]"> <a href="js421254.jpg.xml">AAAAAAA.jpg.xml</a>      16-Jan-2008 01:28   12K
    ...
    ...
    ...
    <img src="/icons/image2.gif" alt="[IMG]"> <a href="BBdBBB.AAAAsaAAAA.txt">BBBBB.AAAAAAAA.txt</a> 16-Jan-2008 15:01  1.6K  
    <img src="/icons/unknown.gif" alt="[   ]"> <a href="52542.jpg">AAAAAAA.jpg</a>          16-Jan-2008 01:27  827K  
    <img src="/icons/unknown.gif" alt="[   ]"> <a href="52542.jpg.xml">AAAAAAA.jpg.xml</a>      16-Jan-2008 01:28   12K
    <hr></pre>
    </body></html>

以下に示すような文字を含む新しいテキスト ファイルを作成するにはどうすればよいですか。

期待される結果:

AAAAAAA.jpg
js421254.jpg
...
...
...
52542.jpg
4

3 に答える 3

0

この正規表現が正しく一般化されることを願っています:

with open('path/to/file') as infile, open('/path/to/output', 'w') as outfile:
    for line in infile:
        if line.startswith('lt="[   ]"'):
            hrefs = re.findall("\<a\\s+href=.*\</a\>?", line)
            for href in hrefs:
                target = href.split('=', 1)[1].split(">", 1)[0].strip('"')
                outfile.write("%s\n" target)

お役に立てれば

于 2013-07-23T00:33:52.343 に答える
0

BeautifulSoupは Web スクレイピングに適しています。

from BeautifulSoup import BeautifulSoup

soup = BeautifulSoup("""<img src="/icons/blank.gif" alt="Icon ">
    <a href="?C=N;O=D">Name</a>
    <img src="/icons/unknown.gif" alt="[   ]">
    <a href="AAAAAAA.jpg">AAAAAAA.jpg</a>          16-Jan-2008 01:27  827K
    <img src="/icons/unknown.gif" alt="[   ]">
    <a href="AAAAAAA.jpg.xml">AAAAAAA.jpg.xml</a>      16-Jan-2008 01:28   12K
    <img src="/icons/image2.gif" alt="[IMG]">
    <a href="BBBBB.AAAAAAAA.txt">BBBBB.AAAAAAAA.txt</a> 16-Jan-2008 15:01  1.6K
    <img src="/icons/unknown.gif" alt="[   ]">
    <a href="js421254.jpg">AAAAAAA.jpg</a>          16-Jan-2008 01:27  827K
    <img src="/icons/unknown.gif" alt="[   ]">
    <a href="js421254.jpg.xml">AAAAAAA.jpg.xml</a>      16-Jan-2008 01:28   12K""")

>>> for a in soup.findAll('a'):
...     if str(a.text).strip().lower().endswith('jpg'): print a.text
...
AAAAAAA.jpg
AAAAAAA.jpg
>>>
>>> for a in soup.findAll('a'):
...     if a.get('href').strip().lower().endswith('jpg'): print a.get('href')
... 
AAAAAAA.jpg
js421254.jpg

純粋な Python が必要で、ユース ケースが単純な場合は、正規表現を試すことができます。現実の世界では多くのまれなケースや不正な形式の HTML が存在するため、これはよりトリッキーです。

import re
>>> for match in re.findall(r'<a .+?>(.+?)</a>', html):
...     if match.strip().lower().endswith('jpg'): print match
...     
AAAAAAA.jpg
AAAAAAA.jpg
>>> 

または、href 属性を見ている場合は次のようになります。

>>> for match in re.findall(r'<a href="(.+?)">', html):
...     if match.lower().endswith('jpg'): print match
... 
AAAAAAA.jpg
js421254.jpg

ポルノサイトのような単純なものをスクレイピングするだけなら、正規表現で良い結果が得られるはずです。

str(a.text).strip().lower().endswith('jpg')? – グァバ

  • strip : このメソッドは、文字列の先頭または末尾にあるスペース (タブと改行を含む) を含まない文字列を返します
  • lower : 小文字に変換します (したがって、JPG、jpg、Jpg などのすべての大文字と小文字のバリエーションをテストする必要はありません)。
  • 終了: 文字列が指定した引数 (探しているもの) で終わる場合に True を返します。

ありがとう@Paulo Scardine私も理解できませんでしre.findall(r'<a href="(.+?)">'た - グアバ

re モジュールは、正規表現の Python 実装です。これは、聖書よりも大きな書籍 (新約聖書よりも大きいかもしれません) を持つ広大なテーマです。スタックオーバーフローの回答でその表面を傷つけることができるふりはしません。

最初に奇妙に感じるかもしれないrのは、引用符の前です。これは生の文字列リテラルであり、通常の文字列とは異なり、バックスラッシュは生の文字列内で特別な意味を持たないため、エスケープする必要のない\文字列です (バックスラッシュは正規表現で常に使用されます。この場合、バックスラッシュを含むパターンを使用していません - 習慣の力...)

式に移りましょう:()キャプチャしたいグループをマークします。ドットは任意の文字を意味し、プラス記号はそれらの 1 つ以上を?意味し、検索が貪欲ではないことを意味します (デフォルトは.+、引用符を含む任意の文字に一致する貪欲な検索です)。を使わずに同じ式を試してみると、?何が起こるか理解できます。

于 2013-07-23T00:37:09.273 に答える
0

簡単な解析に正規表現を使用できますが、それはすべて、正確に何を望むかによって異なります。

次のようなものを使用できます。

<t = html text>
import re
for f in re.findall('([a-zA-Z0-9]+\.jpg)[^\.]',t):
    print f

現在のリストにある jpg ファイルを見つけるには、ファイル名に..

重複したくない場合は、次のようにセットでラップできます。

for f in set(re.findall('([a-zA-Z0-9]+\.jpg)[^\.]',t)):

正規表現の説明:

[a-zA-z0-9]+

これにより、文字または数字である 1 つ以上の文字の任意のシーケンスが選択されます。

\.jpg

これにより、正確な文字列が選択されます.jpg

[^\.]

これは、次の文字を指定できないことを意味します。.

最後の部分を除くすべての括弧は、正規表現が選択するすべてのものです。

于 2013-07-23T00:37:26.523 に答える