Могу ли я очистить атрибут «value» с помощью BeautifulSoup из тега img? - PullRequest
1 голос
/ 30 апреля 2020

Я проверял свое понимание веб-очистки и не смог получить указанные значения c к атрибутам внутри тега img. Я могу сузить до правильных ведущих тегов, но как только я пытаюсь получить значение, приписываемое «alt» (img alt = «what_i_want»), я получаю тип none. Или в некоторых других вариантах кода, я получаю только один элемент. Из того, что я понимаю, значение, которое я пытаюсь получить, не является технически текстом или строкой, так что BS на самом деле не имеет ничего, чтобы захватить. Это правильно?

Я пытаюсь получить "EVGA" и другие торговые марки, перечисленные в каждом контейнере:

[<a class="item-brand" href="https://www.newegg.com/EVGA/BrandStore/ID-1402">
    <img alt="EVGA" src="//c1.neweggimages.com/Brandimage_70x28//Brand1402.gif" title="EVGA" />
</a>]

Что у меня так далеко:

webpage = requests.get('https://www.newegg.com/p/pl?Submit=StoreIM&Depa=1&Category=38')
content = webpage.content
soup = BeautifulSoup(content, 'lxml')

containers = soup.find_all("div", class_="item-container")

brand = []

for container in containers:
    cont_brand = container.find_all("div",{"class":"item-info"})
for name_brand in cont_brand:
    brand.append(name_brand.find("img").get("alt"))
print(brand) 

Это фактически даст мне возвращаемое значение ['ASUS'], которое находится где-то посередине списка контейнеров, которые я могу определить. Я не могу найти никаких отклонений в коде html, которые могли бы выделить это среди других. Другой формат кода вернул последнее значение ['ASRock'], но, опять же, я не могу найти причину только для этого. Я предполагаю, что это как-то связано с механикой BS4 (найти) ...? Большинство других вариантов кода, которые используют (find_all), будут возвращать ошибку NoneType, которую, я думаю, я понимаю, основываясь на документации BS. Я попытался заменить 'html .parser' без изменений. В настоящее время изучаю использование Selenium, чтобы узнать, есть ли там ответ.

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 30 апреля 2020

Это потому, что ваш первый для l oop возвращает все элементы. Однако, когда вы ставите следующий для l oop вне внешнего, он всегда дает вам последний элемент. он должен быть внутри внешнего для l oop.

Теперь попробуйте.

webpage = requests.get('https://www.newegg.com/p/pl?Submit=StoreIM&Depa=1&Category=38')
content = webpage.content
soup = BeautifulSoup(content, 'lxml')

containers = soup.find_all("div", class_="item-container")

brand = []

for container in containers:
    cont_brand = container.find_all("div",{"class":"item-info"})
    for name_brand in cont_brand:
        brand.append(name_brand.find("img").get("alt"))
print(brand)

Выход :

['EVGA', 'MSI', 'ASUS', 'MSI', 'Sapphire Tech', 'EVGA', 'GIGABYTE', 'XFX', 'ASUS', 'ASRock', 'EVGA', 'ASUS', 'EVGA', 'GIGABYTE', 'GIGABYTE', 'GIGABYTE', 'EVGA', 'EVGA', 'MSI', 'ASRock', 'EVGA', 'XFX', 'Sapphire Tech', 'ASRock', 'GIGABYTE', 'ASUS', 'MSI', 'MSI', 'MSI', 'MSI', 'MSI', 'EVGA', 'GIGABYTE', 'EVGA', 'ASUS', 'GIGABYTE']

Если у вас BS 4.7.1 или выше, вы можете использовать этот css селектор.

webpage = requests.get('https://www.newegg.com/p/pl?Submit=StoreIM&Depa=1&Category=38')
content = webpage.content
soup = BeautifulSoup(content, 'lxml')

brand = []

for name_brand in soup.select(".item-container .item-info"):
        brand.append(name_brand.find_next('img').get("alt"))
print(brand)
...