Чтобы понять, почему вы получаете TypeError: unhashable type: 'slice'
прочитайте t.m.adam ответ . В двух словах в последней итерации result
переменные указывают на объект bs4.element.Tag
вместо bs4.element.NavigableString
.
Ниже приведено рабочее решение с использованием блока try-exc, поскольку последние 2 <td>
элементов в списке не содержат "stripped_strings" и выдают ValueError: not enough values to unpack (expected 2, got 0)
.
Код: (Python 3.6+, если вы хотите использовать f-strings
)
from bs4 import BeautifulSoup
import requests
url = 'https://skinsalvationsf.com/2012/08/updated-comedogenic-ingredients-list/'
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'}
html = requests.get(url, headers=headers).text
soup = BeautifulSoup(r.text, 'html.parser')
tds = soup.find_all('td')
for td in tds:
try:
ingredient, rating = td.stripped_strings
except ValueError:
pass
else:
print(f'{ingredient} -> {rating}')
Выход:
Acetylated Lanolin -> 5
Coconut Butter -> 8
...
Xylene -> 7
Octyl Palmitate -> 7
<ч />
Вы также можете избавиться от всего try-except-else
и пропустить последние 2 <td>
:
tds = soup.find_all('td')[:-2]
for td in tds:
ingredient, rating = td.stripped_strings
...
Однако администраторы веб-сайта могут решить добавить или удалить некоторые ингредиенты, из-за чего в коде могут отсутствовать некоторые ингредиенты.