Ошибка Beautifulsoup4 при выборе нескольких атрибутов - PullRequest
1 голос
/ 04 июня 2019

Я новичок в bs4 и пытаюсь собрать некоторую информацию о продуктах amazon для университетского задания, в частности, я пытаюсь извлечь категории продуктов со страницы html. Я пытался извлечь его таким образом, но я получил массив void.

Мне нужно извлечь: Бакалея и деликатесы, Конфеты и шоколад, Желейные бобы и жевательные конфеты, Солодка

Это та часть веб-страницы, которую я хотел бы почистить, но я не знаю, как получить к ней доступ:

<div id="wayfinding-breadcrumbs_container" class="a-section a-spacing-none a-padding-medium breadcrumb-fst-exp-1 fst-breadcrumb-feature">
    <ul class="a-unordered-list a-horizontal a-size-small">
         <li><span class="a-list-item">
            <a class="a-link-normal" href="/grocery-breakfast-foods-snacks-organic/b/ref=dp_bc_aui_T1_1?ie=UTF8&node=16310101">
                Grocery & Gourmet Food
            </a>
         </span></li>
         <li><span class="a-list-item">
            <a class="a-link-normal" href="/Candy-Chocolate/b/ref=dp_bc_aui_T1_2?ie=UTF8&node=16322461">
                Candy & Chocolate
            </a>
         </span></li>
         <li><span class="a-list-item">
            <a class="a-link-normal" href="/b/ref=dp_bc_aui_T1_3?ie=UTF8&node=17369013011">
                Jelly Beans & Gummy Candy
            </a>
         </span></li>
         <li><span class="a-list-item">
            <a class="a-link-normal" href="/Licorice-Candy/b/ref=dp_bc_aui_T1_4?ie=UTF8&node=16322521">
                Licorice
            </a>
         </span></li>
    </ul>
</div>
import requests
from bs4 import BeautifulSoup
url = "https://www.amazon.com/dp/" + 'B001GVISJM'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.content, "html.parser")
for divtag in soup.find_all("div", attr={"id" : "wayfinding-breadcrumbs_container"}):
    print(divtag)

Ответы [ 3 ]

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

Вы можете сделать, как показано ниже. Для findind по id вы можете передать его в качестве аргумента функции вместо того, чтобы передавать его внутрь attrs.

from bs4 import BeautifulSoup

t = '''
<div id="wayfinding-breadcrumbs_container" class="a-section a-spacing-none a-padding-medium breadcrumb-fst-exp-1 fst-breadcrumb-feature">
    <ul class="a-unordered-list a-horizontal a-size-small">
         <li><span class="a-list-item">
            <a class="a-link-normal" href="/grocery-breakfast-foods-snacks-organic/b/ref=dp_bc_aui_T1_1?ie=UTF8&node=16310101">
                Grocery & Gourmet Food
            </a>
         </span></li>
         <li><span class="a-list-item">
            <a class="a-link-normal" href="/Candy-Chocolate/b/ref=dp_bc_aui_T1_2?ie=UTF8&node=16322461">
                Candy & Chocolate
            </a>
         </span></li>
         <li><span class="a-list-item">
            <a class="a-link-normal" href="/b/ref=dp_bc_aui_T1_3?ie=UTF8&node=17369013011">
                Jelly Beans & Gummy Candy
            </a>
         </span></li>
         <li><span class="a-list-item">
            <a class="a-link-normal" href="/Licorice-Candy/b/ref=dp_bc_aui_T1_4?ie=UTF8&node=16322521">
                Licorice
            </a>
         </span></li>
    </ul>
</div>
'''

soup = BeautifulSoup(t, 'html.parser')
for divtag in soup.find_all(id="wayfinding-breadcrumbs_container"):
    for d in divtag.find_all(attrs={'class': 'a-link-normal'}):
        print(d.get_text().strip())

Выход:

Grocery & Gourmet Food
Candy & Chocolate
Jelly Beans & Gummy Candy
Licorice
0 голосов
/ 04 июня 2019

Попробуйте это:

for i in soup.find('div', id='wayfinding-breadcrumbs_container').find('ul').find_all('li', class_=None):
    text = i.find('a').text.strip()
    print(text)

или

for i in soup.select('#wayfinding-breadcrumbs_container a'):
    text = i.text.strip()
    print(text)

На настоящей странице amazon есть еще один div, который вы не учитываете. Структура:

<div>
<div> <--- missing in your post
<ul>
<li>
...

На заметку: Амазонка очень требовательна к соскобам. Без использования таймеров, прокси-серверов, файлов cookie и петель резервирования ваш скребок будет очень непоследовательным.

0 голосов
/ 04 июня 2019

Короткий и быстрый селектор (объединение идентификатора для хлебных крошек и затем селектор типа a для ссылок.

categories = [item['href'] for item in soup.select('#wayfinding-breadcrumbs_feature_div a')]
...