web-dev-qa-db-ja.com

特定の属性のみを持つタグを見つける方法-BeautifulSoup

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">_)のみを返したい

67
Snaxib

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>
84
Loïc G.

documentation で説明されているように、lambdafindAll関数を使用できます。あなたの場合、valign = "top"のみでtdタグを検索するには、次を使用します。

td_tag_list = soup.findAll(
                lambda tag:tag.name == "td" and
                len(tag.attrs) == 1 and
                tag["valign"] == "top")
40
Yogesh

任意の値を持つ属性名でのみ検索したい場合

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})
19
Amr

これを行う最も簡単な方法は、新しいCSSスタイルselectメソッドを使用することです。

soup = BeautifulSoup(html)
results = soup.select('td[valign="top"]')
10
Chris Redford

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>]
3
juliomalegria

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]')
0