Jak mógłbym, używając BeautifulSoup, wyszukiwać tagi zawierające TYLKO atrybuty, których szukam?
Na przykład chcę znaleźć wszystko <td valign="top">
tagi.
Poniższy kod:
raw_card_data = soup.fetch('td', {'valign':re.compile('top')})
pobiera wszystkie potrzebne mi dane, ale także pobiera wszystkie <td>
znaczniki, które mają ten atrybutvalign:top
Próbowałem też:
raw_card_data = soup.findAll(re.compile('<td valign="top">'))
i to nic nie zwraca (prawdopodobnie z powodu złego wyrażenia regularnego)
Zastanawiałem się, czy istnieje sposób w BeautifulSoup, aby powiedzieć „Znajdź <td>
tagi, których jedynym atrybutem jest valign:top
”
UPDATE
FOR przykład, jeśli dokument HTML zawierał następujące <td>
tagi:
<td valign="top">.....</td><br />
<td width="580" valign="top">.......</td><br />
<td>.....</td><br />
Chciałbym, aby powrócił tylko pierwszy <td>
tag ( <td width="580" valign="top">
)
źródło
<tr>
tagi z atrybutemvalign="top"
, w tym te z innymi atrybutami (<td width="580" valign="top">
jest również zwracane w tym wyszukiwaniu) Szukam metody znajdowania<tr>
tagów, których jedynym atrybutem jestvalign="top"
Możesz używać
lambda
funkcji wfindAll
sposób wyjaśniony w dokumentacji . Aby w twoim przypadku wyszukaćtd
tag, używając tylkovalign = "top"
następujących:td_tag_list = soup.findAll( lambda tag:tag.name == "td" and len(tag.attrs) == 1 and tag["valign"] == "top")
źródło
jeśli chcesz wyszukiwać tylko według nazwy atrybutu o dowolnej wartości
from bs4 import BeautifulSoup import re soup= BeautifulSoup(html.text,'lxml') results = soup.findAll("td", {"valign" : re.compile(r".*")})
jak na Steve Lorimer lepiej przekazać True zamiast regex
results = soup.findAll("td", {"valign" : True})
źródło
r".*"
, co powoduje, że to się nie kompiluje.True
:results = soup.findAll("td", {"valign" : True})
Najłatwiej to zrobić za pomocą nowej
select
metody stylu CSS :soup = BeautifulSoup(html) results = soup.select('td[valign="top"]')
źródło
Po prostu podaj to jako argument
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>]
źródło
<td width="580" valign="top">
? Nie chcę ichvalign="top"
Dodając kombinację odpowiedzi Chrisa Redforda i Amra, możesz również wyszukać nazwę atrybutu o dowolnej wartości za pomocą polecenia 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]')
źródło
znajdź używając atrybutu w dowolnym tagu
<th class="team" data-sort="team">Team</th> soup.find_all(attrs={"class": "team"}) <th data-sort="team">Team</th> soup.find_all(attrs={"data-sort": "team"})
źródło