Saya menggunakan Beautiful Soup untuk mengikis situs web, dan mengalami masalah saat menggunakan decompose() untuk menghapus tag <del> di dalam bagian yang saya gores.

Semua produk di halaman memiliki harga di dalam <div> dengan kelas product-card__price. Namun, beberapa produk didiskon dan berisi dua harga dalam <div> ini. Harga lengkap tercantum dalam tag (<del>$</del>) yang mendahului harga saat ini.

# Example 1 - one price
<div class="flex-split__item product-card__price">
    $11.99          
</div>
# Example 2 - two prices
<div class="flex-split__item product-card__price">
   <del>$9.99</del> 
   $8.99          
</div>

Jika saya hanya mengambil teks dalam div ini dengan price = container.find(class_ = 'product-card__price').text.strip(), Contoh #2 akan mengembalikan $9.99 $8.99. Membaca dokumentasi, saya berpikir bahwa saya harus dapat menggunakan decompose() untuk menghapus teks yang terdapat dalam <del></del> dengan kode berikut:

if container.find(class_ = 'product-card__price'):
   if container.find('del'):
      full_price = container.find('del').text.strip()
      current_price = container.find(class_ = 'product-card__price').decompose()
   else:
      full_price = None
      price = container.find(class_ = 'product-card__price').text.strip()
else:
   price = None
   full_price = None

Namun, ini mengembalikan hasil None. Saya dapat membagi string dengan Regexp, tetapi ingin memahami apa yang saya lakukan salah dengan dekomposisi/ekstrak. Contoh halaman web di sini.

1
roody 12 Mei 2021, 22:08

2 jawaban

Jawaban Terbaik

Untuk mendapatkan full_price dan price Anda tidak perlu .extract()/.decompose() tag <del>. Yang diperlukan hanyalah menggunakan str.split() sederhana:

import requests
from bs4 import BeautifulSoup


url = "https://gtfoitsvegan.com/shop/?v=7516fd43adaa"
soup = BeautifulSoup(requests.get(url).content, "html.parser")

for product in soup.select(".product-card"):
    prices = product.select_one(".product-card__price").text.split()
    if len(prices) == 2:
        full_price, price = prices
    else:
        full_price = "-"
        price = prices[0]

    title = product.select_one(".product-card__title").get_text(strip=True)

    print("{:<65}{:<7}{:<7}".format(title, full_price, price))

Cetakan:

Italian Sausage Meatballs by Hungry Planet                       -      $7.99  
Pork Gyoza by Hungry Planet                                      -      $7.99  
Asian Pork Meatballs by Hungry Planet                            -      $6.29  
Grilled and Diced Chicken by Hungry Planet                       -      $7.99  
Grilled Chicken Strips by Hungry Planet                          -      $7.99  
Crispy Fried Chicken Patties by Hungry Planet                    -      $7.99  
New England Style Crab Cakes by Hungry Planet                    -      $11.99 
Ground Beef by Hungry Planet                                     $9.99  $8.99  
Burger Patties by Hungry Planet                                  $11.99 $9.99  
Southwest Chipotle Chicken Patties by Hungry Planet              -      $11.99 
Italian Jack Sausages by Jack & Annie’s                          -      $8.69  
Apple Jack Sausages by Jack & Annie’s                            -      $8.69  
Sliced Mozzarella Soy Cheese by Tofutti                          -      $4.69  
Train Your Dragon Smoothie / Pitaya Bowl by Rollin’ n Bowlin’    -      $6.89  
Organic Mini Thyme Leaf by Simply Organic                        -      $2.49  
Organic Mini Rosemary Leaf by Simply Organic                     -      $2.49  
Organic Mini Onion Powder by Simply Organic                      -      $2.49  
Organic Mini Ground Cumin by Simply Organic                      -      $2.49  
Chick’n Pieces By Like Meat                                      -      $8.59  
BBQ Chick’n By Like Meat                                         -      $8.59  
Nuggets by Like Meat                                             -      $8.59  
Grilled Chick’n by Like Meat                                     -      $8.59  
Zalmon Sashimi 10.9oz by Vegan Zeastar                           -      $15.99 
Very Good Dog by The Very Good Butchers                          -      $7.99  
1
Andrej Kesely 12 Mei 2021, 19:20

Diambil dari di sini, Anda dapat menemukan Teks dengan menemukan elemen <del> dan mengambil saudara berikutnya termasuk teks:

price = container.find("del").find_next_sibling(text=True).strip()
0
Talon 12 Mei 2021, 19:32