如何从元素 class 名称中抓取子字符串?
How to scrape substring from elements class names?
从 website 抓取产品信息时,我喜欢从以下元素的 class 名称中提取子字符串。
<li class="product type-product post-77078 status-publish first outofstock product_cat-lozyska taxable shipping-taxable purchasable product-type-simple">
我想抓取'product_cat-lozyska',但是由于记录很多,这部分可能会有所不同,例如'product_cat-uszczelnienia'(粗体部分始终存在)。我想抓取所有这些 product_cat-。
从 HTML 抓取其他内容的代码示例:
products = soup.find('ul', {'class':re.compile('^products')}).find_all('li')
for product in products:
try:
productName = product.find('span',{'class':'sku'}).text
except:
productName = 'none'
基于此结构:
如果您想抓取所有以 product_cat-
开头的 class 名称,您可以使用以下 comprehension
来做到这一点 - 它遍历您的产品,选择 class
作为列表,迭代它并且只有 return 这些名称 startswith()
你的模式。
注意:comprehension
是基于集合的,所以你会避免重复的class名字:
set(c.split('product_cat-')[-1] for p in products for c in p.get('class') if c.startswith('product_cat-'))
#output
{'pasy-napedowe', 'uszczelnienia-hydrauliki-silowej', 'lozyska', 'lancuchy-i-kola-lancuchowe', 'uncategorized'}
在您的流程中包含上述方法,以获取每个产品的class信息,您可以使用next()
迭代class 姓名:
cat = next(c.split('product_cat-')[-1] for c in product.get('class') if c.startswith('product_cat-'))
例子
...
products = soup.find('ul', {'class':re.compile('^products')}).find_all('li')
data = []
for product in products:
try:
productName = product.find('span',{'class':'sku'}).text
except:
productName = 'none'
try:
cat = next(c.split('product_cat-')[-1] for c in product.get('class') if c.startswith('product_cat-'))
except:
cat = 'none'
data.append({
'productName':productName,
'cat':cat
})
df = pd.DataFrame(data)
df.to_csv('products.csv', index=False)
输出
productName
cat
ZZ 901054 VAY
uszczelnienia-hydrauliki-silowej
ZZ 851005 VAY
uszczelnienia-hydrauliki-silowej
ZZ 80954 VAY
uszczelnienia-hydrauliki-silowej
ZZ 75904 VAY
uszczelnienia-hydrauliki-silowej
ZZ 70854 VAY
uszczelnienia-hydrauliki-silowej
ZZ 65805 VAY
uszczelnienia-hydrauliki-silowej
ZZ 65804 VAY
uszczelnienia-hydrauliki-silowej
ZZ 60755 VAY
uszczelnienia-hydrauliki-silowej
ZZ 55654 VAY
uszczelnienia-hydrauliki-silowej
ZZ 50604 VAY
uszczelnienia-hydrauliki-silowej
ZZ 45554 VAY
uszczelnienia-hydrauliki-silowej
ZZ 40504 VAY
uszczelnienia-hydrauliki-silowej
ZZ 35454 VAY
uszczelnienia-hydrauliki-silowej
ZZ 30404 VAY
uszczelnienia-hydrauliki-silowej
XPA 710 CT
pasy-napedowe
UCP 202 KBF
lozyska
U298/U291 SET9
lozyska
您可以使用 lambda 函数并使用 startsWith 函数,如下所示:
products = soup.findAll("li", {"class" : lambda L: L and L.startswith('product_cat-')})
或者使用正则表达式,如下所示:
products = soup.findAll("li", {"class" : re.compile('product_cat-.*')})
要获取有关所有 SKU 的信息,您可以使用下一个示例(只需遍历 class="product"
的元素):
import requests
import pandas as pd
from bs4 import BeautifulSoup
url = "https://specjal.com/sklep/"
soup = BeautifulSoup(requests.get(url).content, "html.parser")
all_data = []
for p in soup.select(".product"):
price = p.select_one(".price-intax")
stock = p.select_one(".in-stock, .out-of-stock")
all_data.append(
{
"sku": p.select_one(".sku").text,
"title": p.select_one(".woocommerce-loop-product__title").text,
"link": p.select_one(".woocommerce-loop-product__link")["href"],
"stock": stock.text,
"price": price.text if price else "-",
}
)
df = pd.DataFrame(all_data)
print(df)
df.to_csv("data.csv", index=False)
打印:
sku title link stock price
0 ZZ 90*105*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1064/ 10 in stock 14.86zł/szt.
1 ZZ 85*100*5 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1063/ 10 in stock 13.76zł/szt.
2 ZZ 80*95*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1062/ 20 in stock 12.66zł/szt.
3 ZZ 75*90*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1061/ 20 in stock 11.01zł/szt.
4 ZZ 70*85*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1060/ 20 in stock 9.91zł/szt.
5 ZZ 65*80*5 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1059/ 20 in stock 9.36zł/szt.
6 ZZ 65*80*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1058/ 20 in stock 9.36zł/szt.
7 ZZ 60*75*5 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1057/ 14 in stock 8.25zł/szt.
8 ZZ 55*65*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1056/ 10 in stock 7.71zł/szt.
9 ZZ 50*60*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1055/ 20 in stock 6.61zł/szt.
10 ZZ 45*55*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1054/ 20 in stock 6.05zł/szt.
11 ZZ 40*50*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1053/ 17 in stock 5.39zł/szt.
12 ZZ 35*45*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1052/ 30 in stock 4.8zł/szt.
13 ZZ 30*40*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1051/ 20 in stock 4.26zł/szt.
14 XPA 710 CT Pas klinowy CONTITECH https://specjal.com/produkt/pas-klinowy-contitech-518/ Out of stock 39.61zł/szt.
15 UCP 202 KBF Łożysko samonastawne z obudową https://specjal.com/produkt/lozysko-samonastawne-z-obudowa-68/ Out of stock 19.7zł/szt.
...
并保存 data.csv
(来自 LibreOffice 的屏幕截图):
从 website 抓取产品信息时,我喜欢从以下元素的 class 名称中提取子字符串。
<li class="product type-product post-77078 status-publish first outofstock product_cat-lozyska taxable shipping-taxable purchasable product-type-simple">
我想抓取'product_cat-lozyska',但是由于记录很多,这部分可能会有所不同,例如'product_cat-uszczelnienia'(粗体部分始终存在)。我想抓取所有这些 product_cat-。
从 HTML 抓取其他内容的代码示例:
products = soup.find('ul', {'class':re.compile('^products')}).find_all('li')
for product in products:
try:
productName = product.find('span',{'class':'sku'}).text
except:
productName = 'none'
基于此结构:
如果您想抓取所有以 product_cat-
开头的 class 名称,您可以使用以下 comprehension
来做到这一点 - 它遍历您的产品,选择 class
作为列表,迭代它并且只有 return 这些名称 startswith()
你的模式。
注意:comprehension
是基于集合的,所以你会避免重复的class名字:
set(c.split('product_cat-')[-1] for p in products for c in p.get('class') if c.startswith('product_cat-'))
#output
{'pasy-napedowe', 'uszczelnienia-hydrauliki-silowej', 'lozyska', 'lancuchy-i-kola-lancuchowe', 'uncategorized'}
在您的流程中包含上述方法,以获取每个产品的class信息,您可以使用next()
迭代class 姓名:
cat = next(c.split('product_cat-')[-1] for c in product.get('class') if c.startswith('product_cat-'))
例子
...
products = soup.find('ul', {'class':re.compile('^products')}).find_all('li')
data = []
for product in products:
try:
productName = product.find('span',{'class':'sku'}).text
except:
productName = 'none'
try:
cat = next(c.split('product_cat-')[-1] for c in product.get('class') if c.startswith('product_cat-'))
except:
cat = 'none'
data.append({
'productName':productName,
'cat':cat
})
df = pd.DataFrame(data)
df.to_csv('products.csv', index=False)
输出
productName | cat |
---|---|
ZZ 901054 VAY | uszczelnienia-hydrauliki-silowej |
ZZ 851005 VAY | uszczelnienia-hydrauliki-silowej |
ZZ 80954 VAY | uszczelnienia-hydrauliki-silowej |
ZZ 75904 VAY | uszczelnienia-hydrauliki-silowej |
ZZ 70854 VAY | uszczelnienia-hydrauliki-silowej |
ZZ 65805 VAY | uszczelnienia-hydrauliki-silowej |
ZZ 65804 VAY | uszczelnienia-hydrauliki-silowej |
ZZ 60755 VAY | uszczelnienia-hydrauliki-silowej |
ZZ 55654 VAY | uszczelnienia-hydrauliki-silowej |
ZZ 50604 VAY | uszczelnienia-hydrauliki-silowej |
ZZ 45554 VAY | uszczelnienia-hydrauliki-silowej |
ZZ 40504 VAY | uszczelnienia-hydrauliki-silowej |
ZZ 35454 VAY | uszczelnienia-hydrauliki-silowej |
ZZ 30404 VAY | uszczelnienia-hydrauliki-silowej |
XPA 710 CT | pasy-napedowe |
UCP 202 KBF | lozyska |
U298/U291 SET9 | lozyska |
您可以使用 lambda 函数并使用 startsWith 函数,如下所示:
products = soup.findAll("li", {"class" : lambda L: L and L.startswith('product_cat-')})
或者使用正则表达式,如下所示:
products = soup.findAll("li", {"class" : re.compile('product_cat-.*')})
要获取有关所有 SKU 的信息,您可以使用下一个示例(只需遍历 class="product"
的元素):
import requests
import pandas as pd
from bs4 import BeautifulSoup
url = "https://specjal.com/sklep/"
soup = BeautifulSoup(requests.get(url).content, "html.parser")
all_data = []
for p in soup.select(".product"):
price = p.select_one(".price-intax")
stock = p.select_one(".in-stock, .out-of-stock")
all_data.append(
{
"sku": p.select_one(".sku").text,
"title": p.select_one(".woocommerce-loop-product__title").text,
"link": p.select_one(".woocommerce-loop-product__link")["href"],
"stock": stock.text,
"price": price.text if price else "-",
}
)
df = pd.DataFrame(all_data)
print(df)
df.to_csv("data.csv", index=False)
打印:
sku title link stock price
0 ZZ 90*105*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1064/ 10 in stock 14.86zł/szt.
1 ZZ 85*100*5 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1063/ 10 in stock 13.76zł/szt.
2 ZZ 80*95*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1062/ 20 in stock 12.66zł/szt.
3 ZZ 75*90*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1061/ 20 in stock 11.01zł/szt.
4 ZZ 70*85*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1060/ 20 in stock 9.91zł/szt.
5 ZZ 65*80*5 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1059/ 20 in stock 9.36zł/szt.
6 ZZ 65*80*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1058/ 20 in stock 9.36zł/szt.
7 ZZ 60*75*5 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1057/ 14 in stock 8.25zł/szt.
8 ZZ 55*65*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1056/ 10 in stock 7.71zł/szt.
9 ZZ 50*60*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1055/ 20 in stock 6.61zł/szt.
10 ZZ 45*55*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1054/ 20 in stock 6.05zł/szt.
11 ZZ 40*50*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1053/ 17 in stock 5.39zł/szt.
12 ZZ 35*45*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1052/ 30 in stock 4.8zł/szt.
13 ZZ 30*40*4 VAY uszczelnienie techniczne NBR https://specjal.com/produkt/uszczelnienie-techniczne-nbr-1051/ 20 in stock 4.26zł/szt.
14 XPA 710 CT Pas klinowy CONTITECH https://specjal.com/produkt/pas-klinowy-contitech-518/ Out of stock 39.61zł/szt.
15 UCP 202 KBF Łożysko samonastawne z obudową https://specjal.com/produkt/lozysko-samonastawne-z-obudowa-68/ Out of stock 19.7zł/szt.
...
并保存 data.csv
(来自 LibreOffice 的屏幕截图):