0

<span class=""> との間のすべてのものを見つけたい </span>

p = re.compile('<span class=\"\">(.*?)\</span>', re.IGNORECASE)
text = re.findall(p, z)

たとえば、この場合、<span class="">foo</span>期待収益はfooですが、それは何かを返します!!! なぜ私のコードがうまくいかないのですか?

乾杯

4

2 に答える 2

4

HTMLは正規言語ではないため、実際には代わりにXMLパーサーを使用する必要があります。

Pythonにはいくつかの選択肢があります。

  • ElementTreeは標準ライブラリの一部です
  • BeautifulSoupは人気のサードパーティライブラリです
  • lxmlは、高速で機能豊富なCベースのライブラリです。
于 2012-09-01T15:39:26.047 に答える
2

元のコードはそのまま機能します。ただし、HTMLパーサーを使用する必要があります。

import re
p = re.compile('<span class=\"\">(.*?)\</span>', re.IGNORECASE)
z = '<span class="">foo</span>'
text = re.findall(p, z)
print text

出力:

['foo']

編集

ティムが指摘するように、re.DOTALL使用する必要があります。そうしないと、以下が失敗します。

import re
p = re.compile('<span class="">(.*?)\</span>', re.IGNORECASE|re.DOTALL)
z = '''<span class=""> a more
complicated foo</span>'''
text = re.findall(p, z)
print text

それでも、ネストされたスパンでは失敗します。

import re
p = re.compile('<span class="">(.*?)\</span>', re.IGNORECASE|re.DOTALL)
z = '''<span class=""> a more
complicated<span class="other">other</span>foo</span>'''
text = re.findall(p, z)
print text

出力(失敗):

[' a more\ncomplicated<span class="other">other']

したがって、BeautifulSoupのようなHTMLパーサーを使用してください。

from BeautifulSoup import BeautifulSoup
soup = bs(z)
p = re.compile('<span class="">(.*?)\</span>', re.IGNORECASE|re.DOTALL)
z = '''<span class=""> a more
complicated<span class="other">other</span>foo</span>'''
soup = BeautifulSoup(z)
print soup.findAll('span',{'class':''})
print
print soup.findAll('span',{'class':'other'})

出力:

[<span class=""> a more
complicated<span class="other">other</span>foo</span>]

[<span class="other">other</span>]
于 2012-09-01T15:42:47.150 に答える