2016-10-26 15 views
0

私のようにHTMLを持っている:スパンのテキストを取得するための私のコードがあるbeautifulsoupでスパンの特定のテキストを検索するには?

<tr> 
<span id="ContentPlaceHolder1_grd_reminder_Label1_0">Engineering Mechanics</span> 
</tr> 
<tr> 
<span id="ContentPlaceHolder1_grd_reminder_Label1_2">Engineering Mechanics</span> 
</tr> 
... 

:この行spans.id == "ContentPlaceHolder1_grd_reminder_Label***"

trs = soup.find_all('tr') 
for tr in trs: 
    spans = tr.find_all('span') 
    if spans.id == "ContentPlaceHolder1_grd_reminder_Label***": 
     print spans.string 

、私が先頭に同じテキストを持つすべてのIDを取得したいが、最後に異なる数字(上記の内容のように最後の数字 - 1_0)。しかし、私のコードはエラーです。どうすれば解決できますか?

答えて

0

まず第一に、あなたの現在のコードは、複数の理由のために動作しません:

  • spansは実際にResultSetオブジェクトである - タグのリストと言ってもspans場合id属性
  • を持っていません単一のTagインスタンスである場合、spans.idid属性を取得しません。実際にはspans.find("id")を意味し、結果はNoneとなります。 span["id"]
  • あなたは

我々はもっと良いときれいにそれを解決することができ、文字列に==*で部分一致を行うことはできません。例えば、辞書のようにそれを使用し、Tagの属性値を取得するにはとにかく。


一番簡単な方法は、CSS selector "で始まり" を使用することです:

for elm in soup.select("span[id^=ContentPlaceHolder1_grd_reminder_Label]"): 
    print(elm.get_text()) 

あるいは、find_all()を経由している場合、あなたはfiltering functionを使用することができ、次のいずれか

for elm in soup.find_all("span", id=lambda value: value and value.startswith("ContentPlaceHolder1_grd_reminder_Label"): 
    print(elm.get_text()) 

かを、a regular expression

import re 

for elm in soup.find_all("span", id=re.compile("^ContentPlaceHolder1_grd_reminder_Label")): 
    print(elm.get_text()) 

ここで、^は文字列の先頭を示します。

+0

編集した質問のコードをご覧ください。 – slpcf

+0

@slpcf確かに、同じ答えを見てください:)私は、質問に答えないのですか? – alecxe

+0

ありがとうございます。この 'print(elm [2] .get_text())'のようなものを使うことはできますか? – slpcf

関連する問題