Можно ли искать несколько контейнеров в одной строке кода? - PullRequest
0 голосов
/ 05 мая 2019

У меня есть скребок, который очищает страницу для продуктов. Каждый контейнер настроен одинаково, но они сгруппированы в несколько разных s. Я могу написать код и циклы для каждого класса контейнеров, но я подумал, что было бы яснее написать для всех из них онлайн. Возможно ли это?

HTML-код для каждого из четырех классов идентичен, за исключением имени класса и текста, который я собираю. Это выглядит так:

<tr class="product">

        <td>
        </td>
        <td>
            <a href="LINK">COMPANY NAME
        </td>
        <td data-order="PRODUCT NUMBER">
                            <div class="productnum">PRODUCT NUMBER</div>
                                        <img src="BRAND LOGO">
        </td>
        <td>

                CATEGORIES TEXT
        </td>

Затем будет следующий класс:

<tr class="productGold">

        <td>
        </td>
        <td>
            <a href="LINK">COMPANY NAME
        </td>
        <td data-order="PRODUCT NUMBER">
                            <div class="productnum">PRODUCT NUMBER</div>
                                        <img src="BRAND LOGO">
        </td>
        <td>

                CATEGORIES TEXT
        </td>

... и т. Д.

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

containers = page_soup.findAll("tr",{"class":"productGold"})

Затем я пишу цикл и экспортирую его в CSV. Затем я повторяю для каждого из четырех классов:

{"class":"productGold"}), {"class":"productSilver"}), " 
{"class":"productBronze"}), and {"class":"product"})

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

containers = page_soup.findAll("tr",{"class":"productGold"})

product_names = []
product_numbers = []
categories = []

with open('My-File.csv','w') as f:
    csv_out = csv.writer(f)
    for container in containers:
            product_name = container.a.text
            product_number = container.div.text
            category = container.select_one('td:nth-of-type(4)').text.strip() 

            product_names.append(product_name)
            proudct_numbers.append(product_number)
            categories.append(category)

            csv_out.writerow([product_name, product_number, category])

Тогда:

containers = page_soup.findAll("tr",{"class":"productSilver"})

product_names = []
product_numbers = []
categories = []

with open('My-File_1.csv','w') as f:
    csv_out = csv.writer(f)
    for container in containers:
            product_name = container.a.text
            product_number = container.div.text
            category = container.select_one('td:nth-of-type(4)').text.strip() 

            product_names.append(product_name)
            proudct_numbers.append(product_number)
            categories.append(category)

            csv_out.writerow([product_name, product_number, category])

Тогда то же самое для {"class":"productBronze"}) and {"class":"product"})?

Я думаю, что могу сделать это в этой строке:

containers = page_soup.findAll("tr",{"class":"productGold"})

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

1 Ответ

3 голосов
/ 05 мая 2019

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

import re
containers = page_soup.findAll("tr",class_=re.compile('product'))

Или Вы можете использовать lamda функцию

containers = page_soup.findAll(lambda tag:tag.name == "tr" and [tag.attrs=='class'.startswith('product')])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...