получение значения alt в теге div с помощью Beautifulsoup - PullRequest
0 голосов
/ 02 июня 2019

Я пытаюсь получить значение "4" из HTML ниже с этого веб-сайта . Это только одно из значений на странице списка продуктов. Я хочу, чтобы несколько значений в форме списка помещались в фрейм данных.

<div class="review-stars-on-hover">
<divclass="product-rating">
<divclass="product-rating__meter"alt="4">
<divclass="product-rating__meter-btm">★★★★★</div>
<divclass="product-rating__meter-top"style="width:80%;">★★★★★</div>
</div>
<divclass="product-rating__countedf-font-size--xsmallnsg-text--medium-grey"alt="95">(95)</div>
</div>
</div>...

Я пытался:

items = soup.select('.grid-item-content')
star = [item.find('div', {'class': 'review-stars-on-hover'}).get('alt') for item in items]

Вывод (всего на странице 16 товаров, но не отображается ни один):

[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]

Любой совет, пожалуйста?

Ответы [ 3 ]

1 голос
/ 02 июня 2019

Вы можете выбрать, взяв первое совпадение только для внутреннего класса в родительском классе

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://store.nike.com/us/en_us/pw/mens-walking-shoes/7puZ9ypZoi3')
soup = bs(r.content, 'lxml')
stars = [item.select_one('.product-rating__meter')['alt']  for item in soup.select('.grid-item-box:has(.product-rating__meter)')]
1 голос
/ 03 июня 2019

Попробуйте следующий код. Однако он возвращает 16 записей на основе класса, который вы упомянули, но он имеет только 11 записей для класса product-rating__meter. Я предоставил проверку, доступен ли класс product-rating__meter, затем выведите alt значение. Надеюсь, это поможет.

from bs4 import BeautifulSoup
import requests
data= requests.get('https://store.nike.com/us/en_us/pw/mens-walking-shoes/7puZ9ypZoi3').content
soup = BeautifulSoup(data, 'lxml')
print("Total element count : " + str(len(soup.find_all('div',class_='grid-item-content'))))
for item in soup.find_all('div',class_='grid-item-content'):
    if item.find('div',class_='product-rating__meter'):
        print("Alt value : " + item.find('div',class_='product-rating__meter')['alt'])

выход


Total element count : 16

Alt value : 4
Alt value : 4.3
Alt value : 4.6
Alt value : 4.8
Alt value : 4.4
Alt value : 4.7
Alt value : 4.7
Alt value : 3.8
Alt value : 4.5
Alt value : 3.3
Alt value : 4.5

EDITED

from bs4 import BeautifulSoup
import requests
data= requests.get('https://store.nike.com/us/en_us/pw/mens-walking-shoes/7puZ9ypZoi3').content
soup = BeautifulSoup(data, 'lxml')
print("Total element count : " + str(len(soup.find_all('div',class_='grid-item-content'))))
itemlist=[]
for item in soup.find_all('div',class_='grid-item-content'):
    if item.find('div',class_='product-rating__meter'):
        #print("Alt value : " + item.find('div',class_='product-rating__meter')['alt'])
        itemlist.append("Alt value : " + item.find('div',class_='product-rating__meter')['alt'])
print(itemlist)

Выход:

Total element count : 16
['Alt value : 4', 'Alt value : 4.3', 'Alt value : 4.6', 'Alt value : 4.8', 'Alt value : 4.4', 'Alt value : 4.7', 'Alt value : 4.7', 'Alt value : 3.8', 'Alt value : 4.5', 'Alt value : 3.3', 'Alt value : 4.5']
0 голосов
/ 02 июня 2019

Вы можете написать что-то вроде ниже, чтобы получить все div с атрибутом "alt":

xml = bs.find_all("div", {"alt": True})

И для получения значения:

for x in xml:
    print(x["alt"])

Или, как показано ниже, если вам нужен только первый «alt»:

xml = bs.find("div", {"alt": True})["alt"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...