是否可以在一行代码中搜索多个容器?

时间:2019-05-05 12:08:08

标签: python web-scraping beautifulsoup

我有一个刮板,可以刮取产品页面。每个容器的设置方法相同,但是将它们分为几个不同的。我可以为每个类的容器编写代码和循环,但是我认为为所有这些容器在线编写会更清晰。这可能吗?

四个类的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 个答案:

答案 0 :(得分:3)

使用正则表达式将查找与产品相关的所有类。

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')])