<span class="">
との間のすべてのものを見つけたい </span>
p = re.compile('<span class=\"\">(.*?)\</span>', re.IGNORECASE)
text = re.findall(p, z)
たとえば、この場合、<span class="">foo</span>
期待収益はfooですが、それは何かを返します!!! なぜ私のコードがうまくいかないのですか?
乾杯
HTMLは正規言語ではないため、実際には代わりにXMLパーサーを使用する必要があります。
Pythonにはいくつかの選択肢があります。
元のコードはそのまま機能します。ただし、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>]