我有一个刮板,可以刮取产品页面。每个容器的设置方法相同,但是将它们分为几个不同的。我可以为每个类的容器编写代码和循环,但是我认为为所有这些容器在线编写会更清晰。这可能吗?
四个类的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"})
但是我没有使它起作用。任何帮助将不胜感激。
答案 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')])