2017-10-31 3 views
0

<html><table>...<table>...</table>...</table><table>...</table>...</html>美味しいスープの中で一番上の検索のしかたを見つける方法?例えば

Iは上記スープためsoup.find_all( 'テーブル')を使用している場合、私は3つのテーブルを取得します。私は、テーブルの最初のインスタンスを取得した後、スープに深く掘り下げず、現在のインスタンスの後にそのテーブルの次のインスタンスを見つけようとするようにしたいと思います。つまり、内部にネストされたテーブルと2番目のテーブルがネストされた最初のテーブルを返します。私はこの行動遂行の最も効率的な方法が何であるかを知りたい。

は今、私が行って、でそれを処理しています:

from copy import deepcopy 
tables = soup.find_all('table') 
reduced_tables = deepcopy(tables) 
for table in tables: 
    if list(filter(lambda x: table !=x and table in x, tables)) != []: 
     reduced_tables.remove(table) 
+0

を= 3) '? –

+0

@ t.m.adam残念ながら、テーブルの数は不明です。 –

答えて

1

オプション1:タグの直接の子孫のみを選択するようにfind_allrecursive引数を使用します。

オプション2:find_allにラムダを使用し、find_parentでフィルタすると、特定のタグの子孫でないタグを選択できます。

例:

html = ''' 
<html> 
<table>table 1</table> 
<div><table>table 2</table></div> 
<table>table 3<table>table 4</table></table> 
<html> 
''' 
soup = BeautifulSoup(html, 'html.parser') 

tables = soup.html.find_all('table', recursive=False) 
print(tables) 

tables = soup.find_all(lambda tag: tag.name=='table' and not tag.find_parent('table')) 
print(tables) 

出力:それはの直接の子孫ではないとして第一オプションでは、表2を選択しなかった

[<table>table 1</table>, <table>table 3<table>table 4</table></table>]

[<table>table 1</table>, <table>table 2</table>, <table>table 3<table>table 4</table></table>]

html 'であるが、第2のオプション3つのトップテーブルをすべて返しました。

あなたがネストした表(表4)を削除したい場合はdecompose方法、例えば使用:soup.find_all( 'テーブル'、リミット `のようなもの

for table in tables: 
    for tag in table.find_all('table'): 
     tag.decompose() 
print(tables) 

[<table>table 1</table>, <table>table 2</table>, <table>table 3</table>]

+0

私は実際には、テーブルを親として持っていないすべてのテーブルを抽出して、それらを解析できるようにしたいと考えました。 –

+0

申し訳ありませんが私は誤解、私の答えを更新しました。 –

+0

これは、テーブルがスープの最上位にある場合にのみ機能します。再帰的なkwargは、検索オブジェクトの最上位レベルをチェックするのではなく、スープのトップレベルのみをチェックすることを意味します。 –

関連する問題