BeautifulSoupを使用して、検索する属性のみを含むタグを検索するにはどうすればよいですか?
たとえば、すべての_<td valign="top">
_タグを検索したい。
次のコード:raw_card_data = soup.fetch('td', {'valign':re.compile('top')})
必要なすべてのデータを取得しますが、属性_<td>
_を持つ_valign:top
_タグも取得します
私も試しました:raw_card_data = soup.findAll(re.compile('<td valign="top">'))
そしてこれは何も返しません(おそらく正規表現が悪いため)
BeautifulSoupで「属性が_<td>
_のみである_valign:top
_タグを検索する」方法があるかどうか疑問に思っていました
[〜#〜] update [〜#〜]たとえば、HTMLドキュメントに次の_<td>
_タグが含まれている場合:
_<td valign="top">.....</td><br />
<td width="580" valign="top">.......</td><br />
<td>.....</td><br />
_
最初の_<td>
_タグ(_<td width="580" valign="top">
_)のみを返したい
BeutifulSoupドキュメント で説明されているように
これを使用できます:
soup = BeautifulSoup(html)
results = soup.findAll("td", {"valign" : "top"})
編集:
Valign = "top"属性のみを持つタグを返すには、タグattrs
プロパティの長さを確認できます。
from BeautifulSoup import BeautifulSoup
html = '<td valign="top">.....</td>\
<td width="580" valign="top">.......</td>\
<td>.....</td>'
soup = BeautifulSoup(html)
results = soup.findAll("td", {"valign" : "top"})
for result in results :
if len(result.attrs) == 1 :
print result
それは返します:
<td valign="top">.....</td>
documentation で説明されているように、lambda
でfindAll
関数を使用できます。あなたの場合、valign = "top"
のみでtd
タグを検索するには、次を使用します。
td_tag_list = soup.findAll(
lambda tag:tag.name == "td" and
len(tag.attrs) == 1 and
tag["valign"] == "top")
任意の値を持つ属性名でのみ検索したい場合
from bs4 import BeautifulSoup
import re
soup= BeautifulSoup(html.text,'lxml')
results = soup.findAll("td", {"valign" : re.compile(r".*")})
steve Lorimerによると、正規表現ではなくTrueを渡す方が良い
results = soup.findAll("td", {"valign" : True})
これを行う最も簡単な方法は、新しいCSSスタイルselect
メソッドを使用することです。
soup = BeautifulSoup(html)
results = soup.select('td[valign="top"]')
findAll
の引数として渡すだけです:
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup("""
... <html>
... <head><title>My Title!</title></head>
... <body><table>
... <tr><td>First!</td>
... <td valign="top">Second!</td></tr>
... </table></body><html>
... """)
>>>
>>> soup.findAll('td')
[<td>First!</td>, <td valign="top">Second!</td>]
>>>
>>> soup.findAll('td', valign='top')
[<td valign="top">Second!</td>]
Chris Redfordの答えとAmrの答えを組み合わせて追加すると、selectコマンドで任意の値を持つ属性名を検索することもできます。
from bs4 import BeautifulSoup as Soup
html = '<td valign="top">.....</td>\
<td width="580" valign="top">.......</td>\
<td>.....</td>'
soup = Soup(html, 'lxml')
results = soup.select('td[valign]')