私はBS4に特定のクラスを含む要素をフィルタリングさせようとしています。ここに私のHTMLです:美しいスープを使ったPython2 - 複数のCSSクラスを持つ要素のフィルタリング
<!-- language: lang-html -->
<html>
<head>
<title>Test</title>
</head>
<body>
<table>
<tr class='test hidden'><td>foo</td></tr>
<tr class='testabc'><td>bar</td></tr>
<tr class='test hidden'><td>foo</td></tr>
<tr class='testxyz'><td>bar</td></tr>
</table>
</body>
</html>
そして、私のPythonコード:
# import libraries
import urllib2
import re
from bs4 import BeautifulSoup
from bs4 import Comment
import operator
with open('sample.html', 'r') as myfile:
html=myfile.read()
soup = BeautifulSoup(html, 'html.parser')
rows = soup.find('table').find_all('tr', class_=lambda x: 'hidden' not in x)
for row in rows:
print row
あなたはテーブルがいずれかのクラス=「テスト隠された」またはクラス=「フル」が列を持っていることがわかります。私は 'hidden'が要素のクラスではない行をすべて取得しようとしています。
基本的に私は出力になりたい:代わり
<tr class='testabc'><td>bar</td></tr>
<tr class='testxyz'><td>bar</td></tr>
、私はすべての行を取得:
<tr class='test123 hidden'><td>foo</td></tr>
<tr class='testabc'><td>bar</td></tr>
<tr class='test456 hidden'><td>foo</td></tr>
<tr class='testxyz'><td>bar</td></tr>
私は "ないで" の複数の組み合わせを試してみたのか"!="。私はラムダが呼び出す関数を作成しようとしたので、xがどんな型のオブジェクトであるかを知ることができ、それを扱う方法をよりよく理解できますが、ラムダをハードコードしない限り、ラムダxのようなもの:x == 'testabc'またはx == 'testxyz'
これは私が試みていることをすることは可能ですか?誰かが私を正しい方向に向けることができますか?
from bs4 import BeautifulSoup
html = """
<html>
<head>
<title>Test</title>
</head>
<body>
<table>
<tr class='test hidden'><td>foo</td></tr>
<tr class='testabc'><td>bar</td></tr>
<tr class='test hidden'><td>foo</td></tr>
<tr class='testxyz'><td>bar</td></tr>
</table>
</body>
</html>
"""
soup = BeautifulSoup(html, 'html.parser')
rows = soup.find('table').find_all('tr')
for row in rows:
if 'hidden' not in row.attrs['class']:
print row
が出力:
<tr class="testabc"><td>bar</td></tr>
<tr class="testxyz"><td>bar</td></tr>
これは素晴らしいです!あなたの最初の例でラムダを使用しました。それは "エレガント"ではないが、それはそれが悪いとは思わない。他の方法ではなく、このようにしなければならないのはちょっと奇妙です。私が元々書いたものにかなり近いです。 ありがとう!これまでのPythonを愛して、わずか数日で... – tjans
ええ、pythonは素晴らしいです。私は数年前からそれを使っていますが、今でも新しいことを生きています! –
合意。私はちょうどそれに入るのを始めましたが、私は、自動化や他の楽しみの点で、私の未来においてすばらしいことを見ます。再度、感謝します。 – tjans