タグに含まれるデータを抽出するだけだと仮定すると、次のように、Pythonモジュール (単純な HTML SAX パーサー) を<p class="location">
使用して、クイック & ダーティ (ただし正しい) アプローチを使用できます。HTMLParser
from HTMLParser import HTMLParser
class MyHTMLParser(HTMLParser):
PLocationID=0
PCount=0
buf=""
out=[]
def handle_starttag(self, tag, attrs):
if tag=="p":
self.PCount+=1
if ("class", "location") in attrs and self.PLocationID==0:
self.PLocationID=self.PCount
def handle_endtag(self, tag):
if tag=="p":
if self.PLocationID==self.PCount:
self.out.append(self.buf)
self.buf=""
self.PLocationID=0
self.PCount-=1
def handle_data(self, data):
if self.PLocationID:
self.buf+=data
# instantiate the parser and fed it some HTML
parser = MyHTMLParser()
parser.feed("""
<html>
<body>
<p>This won't appear!</p>
<p class="location">This <b>will</b></p>
<div>
<p class="location">This <span class="someclass">too</span></p>
<p>Even if <p class="location">nested Ps <p class="location"><b>shouldn't</b> <p>be allowed</p></p> <p>this will work</p></p> (this last text is out!)</p>
</div>
</body>
</html>
""")
print parser.out
出力:
['This will', 'This too', "nested Ps shouldn't be allowed this will work"]
<p class="location">
これにより、タグ内に含まれるすべてのテキストが抽出され、その中のすべてのタグが削除されます。個別のタグ (ネストされていない場合 - 段落には許可されません) は、out
リストに個別のエントリがあります。
より複雑な要件の場合、これは簡単に手に負えなくなることに注意してください。そのような場合、DOM パーサーの方が適しています。