2016-11-04 5 views
2

スパンを含むtdの次のtdを見つけるにはどうすればよいですか?次のtdはスパンタグ付きのtdに基づいて検索します

html_text = """ 
<tr class="someClass"> 
    <td>&nbsp;</td> 
    <td>A normal string</td> 
    <td class="someClass">10</td> 
    <td class="someClass">11</td> 
    <td class="someClass">12</td> 
    <td>&nbsp;</td> 
</tr> 
<tr class="someClass"> 
    <td>&nbsp;</td> 
    <td>Non normal string <span style="font-size:10px">(with span)</span></td> 
    <td class="someClass">2 000</td> 
    <td class="someClass">2 100</td> 
    <td class="someClass">2 150</td> 
    <td>&nbsp;</td> 
</tr> 
""" 

私は単にちょうどでそれを見つけるでしょう、その中に「通常の文字列」とtdの後にTDを取得するために:私はTDを見つける必要がある第二のTRで、しかし

a_normal_string = str(soup.find("td", text="A normal string").find_next('td')) 
a_normal_string = re.findall(r'\d+', a_normal_string) 
print a_normal_string #['10'] 

上の方法のNon normal stringのtdは機能しません。どのようにスパンを含むtdを処理するのですか?

最初に考えてみたのは、正規表現で見つけてa_nonnormal_string = str(soup.find("td", text=re.compile(r'A non normal string')).find_next('td'))をコンパイルすることでしたが、これも適用されません。

これは2つのtrの例ですが、実際には数百のtrがあります。

答えて

1

1つのオプションは、(目的の文字列に対してテキストをチェックするget_text()を使用して、searching functionとそれを解決することですget_text()は、その子要素を含む要素の完全なテキストを返しますが、.string does notことに注意してください - それはもしそこNoneだろう子要素がある - これは実際にあなたの第二のアプローチが動作しない理由)である:

tds = soup.find_all(lambda tag: tag.name == "td" and "normal string" in tag.get_text()) 
for td in tds: 
    a_normal_string = td.find_next('td').get_text() 
    print(a_normal_string) 

プリント:

10 
2 000 
+0

素敵な、私はラムダをよく読んでする必要があります –

関連する問題