【问题标题】:Python 3 Web Scrape & Beautiful SoupPython 3 Web Scrap & Beautiful Soup
【发布时间】:2018-11-14 20:36:08
【问题描述】:

我开始使用 Python 和 Beautiful soup。

我正在练习使用以下代码:-

import requests  
r = requests.get('https://www.autobarn.com.au/car-care-touring-accessories/car-care/washes?dir=asc&limit=48&order=name')

from bs4 import BeautifulSoup  
soup = BeautifulSoup(r.text, 'lxml')  
results = soup.find_all('div', class_='product-details')

records = []  
for result in results:  
    SKU = result.find('small',class_='text-muted').text.strip()
    DESC = result.find('strong').text.strip().upper()
    PRICE = result.find ('span',class_='price')
    URL = result.find('a')['href']
    records.append((SKU, DESC, PRICE, URL))

import pandas as pd  
df = pd.DataFrame(records, columns=['SKU','DESCRIPTION', 'RRP', 'URL'])  
df.to_csv('d:\\WEB SCRAPE TEST 4.csv', index=False, encoding='utf-8')  

这可以很好地获取我想要的信息。

但是,就价格而言,它会遍历所有周围的 HTML 信息。

例如 span class="price" id="product-price-1242" 跨度 class="价格">$6.99

这似乎是由 2 个标签一个接一个相同造成的:- 跨度 class='价格' span class='价格'

虽然我可以在 csv 文件中清理价格数据,但有没有办法改进代码以获取价格?

提前致谢

【问题讨论】:

    标签: python-3.x web-scraping beautifulsoup


    【解决方案1】:

    试试这个。它应该可以解决问题:

    import requests
    from bs4 import BeautifulSoup  
    
    url = 'https://www.autobarn.com.au/car-care-touring-accessories/car-care/washes?dir=asc&limit=48&order=name'
    
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'lxml')  
    for result in soup.find_all('div', class_='product-details'): 
        SKU = result.find('small',class_='text-muted').text.strip()
        DESC = result.find('strong').text.strip().upper() 
    
        try:
            PRICE = result.select_one("[id^='product-price-'] span").text
        except AttributeError: PRICE = ""
    
        URL = result.find('a')['href']
        print(SKU, DESC, PRICE, URL)
    

    【讨论】:

    • 谢谢。工作得很好。我需要了解您如何选择 html 元素和使用的语法。这让我发疯了。
    • 或者它应该也可以工作PRICE = result.find(lambda item:item.get('id')).find(class_='price').text
    【解决方案2】:

    你可以这样做:

    PRICE = result.find('span',class_='price').find('span',class_='price').text
    

    您还必须决定如何处理没有可用价格的情​​况。也许是这样的:

    if result.find('span',class_='price') is None:
        PRICE = "N/A"
    else:
        PRICE = result.find('span',class_='price').find('span',class_='price').text
    

    【讨论】:

    • 嗨,谢谢。不幸的是,它返回了 - 'NoneType' 对象没有属性 'find' 。不过我喜欢关于无价的建议。
    • 是的,缺少价格信息的商品会发生这种情况,因此是后一部分。
    猜你喜欢
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    相关资源
    最近更新 更多