web-dev-qa-db-ja.com

Beautifulsoupで不要なタグを除外するPython

<span>
  I Like
  <span class='unwanted'> to punch </span>
   your face
 </span>

「あなたの顔をパンチするのが好き」の代わりに「あなたの顔が好き」を印刷する方法

私はこれを試しました

lala = soup.find_all('span')
for p in lala:
 if not p.find(class_='unwanted'):
    print p.text

しかし、「TypeError:find()はキーワード引数を取りません」

9
masbro

テキストを取得する前に、extract()を使用して不要なタグを削除できます。

しかし、すべてを保持します'\n'spacesなので、削除するにはいくつかの作業が必要になります。

data = '''<span>
  I Like
  <span class='unwanted'> to punch </span>
   your face
 <span>'''

from bs4 import BeautifulSoup as BS

soup = BS(data, 'html.parser')

external_span = soup.find('span')

print("1 HTML:", external_span)
print("1 TEXT:", external_span.text.strip())

unwanted = external_span.find('span')
unwanted.extract()

print("2 HTML:", external_span)
print("2 TEXT:", external_span.text.strip())

結果

1 HTML: <span>
  I Like
  <span class="unwanted"> to punch </span>
   your face
 <span></span></span>
1 TEXT: I Like
   to punch 
   your face
2 HTML: <span>
  I Like

   your face
 <span></span></span>
2 TEXT: I Like

   your face

外部スパン内のすべてのTagオブジェクトをスキップして、NavigableStringオブジェクトのみを保持できます(HTMLのプレーンテキストです)。

data = '''<span>
  I Like
  <span class='unwanted'> to punch </span>
   your face
 <span>'''

from bs4 import BeautifulSoup as BS
import bs4

soup = BS(data, 'html.parser')

external_span = soup.find('span')

text = []
for x in external_span:
    if isinstance(x, bs4.element.NavigableString):
        text.append(x.strip())
print(" ".join(text))

結果

I Like your face
8
furas

あなたは簡単にこのような(望まない)テキストを見つけることができます:

from bs4 import BeautifulSoup

text = """<span>
  I Like
  <span class='unwanted'> to punch </span>
   your face
 <span>"""
soup = BeautifulSoup(text, "lxml")
for i in soup.find_all("span"):
    if 'class' in i.attrs:
        if "unwanted" in i.attrs['class']:
            print(i.text)

ここから他のすべてを出力することは簡単に行うことができます

1
Gábor Erdős