Wie würde ich mit BeautifulSoup nach Tags suchen, die NUR die Attribute enthalten, nach denen ich suche?
Zum Beispiel möchte ich alle <td valign="top">
Tags finden.
Der folgende Code:
raw_card_data = soup.fetch('td', {'valign':re.compile('top')})
Ruft alle gewünschten Daten ab, greift aber auch auf jedes <td>
Tag mit dem Attribut zuvalign:top
Ich habe es auch versucht:
raw_card_data = soup.findAll(re.compile('<td valign="top">'))
und dies gibt nichts zurück (wahrscheinlich wegen schlechten Regex)
Ich habe mich gefragt, ob es in BeautifulSoup eine Möglichkeit gibt, " <td>
Tags finden, deren einziges Attribut ist valign:top
" zu sagen.
UPDATE
Zum Beispiel, wenn ein HTML-Dokument die folgenden <td>
Tags enthielt :
<td valign="top">.....</td><br />
<td width="580" valign="top">.......</td><br />
<td>.....</td><br />
Ich möchte, dass nur das erste <td>
Tag ( <td width="580" valign="top">
) zurückgegeben wird
quelle
<tr>
Tags mit dem Attribut gefundenvalign="top"
, auch diejenigen mit anderen Attributen (<td width="580" valign="top">
wird auch bei dieser Suche zurückgegeben). Ich suche nach einer Methode, um<tr>
Tags zu finden, deren einziges Attributvalign="top"
Sie können
lambda
FunktionenfindAll
wie in der Dokumentation beschrieben verwenden . Damit Sie in Ihrem Fall nachtd
Tags suchen, verwenden Sie nurvalign = "top"
Folgendes:td_tag_list = soup.findAll( lambda tag:tag.name == "td" and len(tag.attrs) == 1 and tag["valign"] == "top")
quelle
Wenn Sie nur mit einem Attributnamen mit einem beliebigen Wert suchen möchten
from bs4 import BeautifulSoup import re soup= BeautifulSoup(html.text,'lxml') results = soup.findAll("td", {"valign" : re.compile(r".*")})
Laut Steve Lorimer ist es besser, True statt Regex zu bestehen
results = soup.findAll("td", {"valign" : True})
quelle
r".*"
, was dazu führt, dass diese nicht kompiliert wird.True
:results = soup.findAll("td", {"valign" : True})
Der einfachste Weg, dies zu tun, ist mit der neuen CSS-
select
Stilmethode:soup = BeautifulSoup(html) results = soup.select('td[valign="top"]')
quelle
Übergeben Sie es einfach als Argument von
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>]
quelle
<td width="580" valign="top">
? Ich möchte diese nicht greifen, nur Tags, deren einziges Attribut istvalign="top"
Wenn Sie eine Kombination aus der Antwort von Chris Redford und Amr hinzufügen, können Sie mit dem Befehl select auch nach einem Attributnamen mit einem beliebigen Wert suchen:
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]')
quelle