Как мне с помощью 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
»
ОБНОВЛЕНИЕ для
примера, если документ HTML содержит следующие <td>
теги:
<td valign="top">.....</td><br />
<td width="580" valign="top">.......</td><br />
<td>.....</td><br />
Я бы хотел, чтобы возвращался только первый <td>
тег ( <td width="580" valign="top">
)
источник
<tr>
теги с атрибутомvalign="top"
, включая теги с другими атрибутами (<td width="580" valign="top">
также возвращается в этом поиске). Я ищу метод для поиска<tr>
тегов, единственный атрибут которыхvalign="top"
Вы можете использовать
lambda
функции в,findAll
как описано в документации . Так что в вашем случае для поискаtd
тегаvalign = "top"
используйте только следующее: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".*")})
согласно Стиву Лоримеру лучше передать True вместо регулярного выражения
results = soup.findAll("td", {"valign" : True})
источник
r".*"
, в результате чего компиляция не выполняется.True
:results = soup.findAll("td", {"valign" : True})
Самый простой способ сделать это - использовать новый
select
метод стиля CSS :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>]
источник
<td width="580" valign="top">
? Я не хочу хватать их, просто теги, единственный атрибут которыхvalign="top"
Добавив комбинацию ответов Криса Редфорда и Амра, вы также можете искать имя атрибута с любым значением с помощью команды 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]')
источник
найти с помощью атрибута в любом теге
<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"})
источник