首页 > 编程问答 >我的 python 抓取数据是空的,不确定我的代码出了什么问题

我的 python 抓取数据是空的,不确定我的代码出了什么问题

时间:2024-07-25 16:16:06浏览次数:11  
标签:python beautifulsoup

我的结果是空的,不确定我的代码出了什么问题:

这里是我的代码:

#尝试从该网站获取数据 https://www.watsons.com.sg/health/c/ 2100000?currentPage=1

import requests
from bs4 import BeautifulSoup
import pandas as pd


# Setting display options for pandas
pd.options.display.width = 1000
pd.options.display.max_rows = 1000

创建用户代理

HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
}

# Create lists
items = []
prices = []


# Function to scrape a page
def scrape_page(page):
    try:
        url = f'https://www.watsons.com.sg/health/c/2100000?currentPage={page}'
        response = requests.get(url, headers=HEADERS)
        response.raise_for_status()  # Check for request errors

        soup = BeautifulSoup(response.text, 'html.parser')

        # Find product items
        product_items = soup.find_all('e2-product-tile', class_='ng-star-inserted hasPromotion-2')
        print(soup)

        for item in product_items:
            # Extract product name
            name = item.find('h2', class_='productName').get_text(strip=True)
            items.append(name)

            # Extract product price
            price = item.find('div', class_='formatted-value ng-star-inserted').get_text(strip=True)
            prices.append(price)

    except requests.RequestException as e:
        print(f"An error occurred: {e}")

以抓取前5页为例

for page in range(1, 2):
    scrape_page(page)

创建一个DataFrame

df = pd.DataFrame({'Item': items, 'Price': prices})

显示DataFrame

print(df)

#以上是我的代码


问题出在尝试查找的 HTML 元素上。网站可能没有使用 <e2-product-tile> 作为产品列表的标签,而且 class_='formatted-value ng-star-inserted' 也可能不是价格所在的 div 的正确类名。

为了解决这个问题,需要检查网站的 HTML 源代码,找到包含产品名称和价格的正确元素和类名。

以下是如何调试代码并找到正确选择器的步骤:

  1. 打印 soup 对象并检查 HTML 结构:

    • scrape_page 函数中 print(soup) 语句的下方,添加以下代码: python with open("watsons_page.html", "w", encoding="utf-8") as f: f.write(soup.prettify())
    • 这会将当前页面的 HTML 源代码保存到名为 watsons_page.html 的文件中。
  2. 在浏览器中打开 watsons_page.html 文件并检查:

    • 使用浏览器的开发者工具(通常按 F12 键打开)检查 HTML 代码,找到包含产品名称和价格的元素。
    • 确定这些元素的标签名称、类名或其他唯一标识符。
  3. 更新代码以使用正确的选择器:

    • product_items name price 的选择器替换为在步骤 2 中找到的正确选择器。

例如,假设在检查 HTML 代码后发现产品名称位于 <span class="product-name"> 中,价格位于 <div class="price"> 中,那么需要更新代码如下:

    # ... 其他代码 ...

    # Find product items
    product_items = soup.find_all('div', class_='product-grid-tile') 

    for item in product_items:
        # Extract product name
        name_element = item.find('span', class_='product-name')
        name = name_element.get_text(strip=True) if name_element else "N/A"
        items.append(name)

        # Extract product price
        price_element = item.find('div', class_='price')
        price = price_element.get_text(strip=True) if price_element else "N/A"
        prices.append(price)

    # ... 其他代码 ...

请记住,网站结构可能会发生变化,因此请务必定期检查选择器是否仍然有效。

标签:python,beautifulsoup
From: 78792168

相关文章

  • Chrome 浏览器更新后,我的 python tagui 代码工作不稳定。问题的解决方法是什么
    我编写了一个pythontagui脚本来在chrome中操作Intranet网页。它运行良好。但是在chrome浏览器更新后,脚本每次都会在某个时刻随机停止,并且也不会抛出错误。请帮忙。我尝试重新启动电脑,但这并没有解决问题。Chrome浏览器更新后,TagUI脚本工作不稳定的问题可能由以......
  • 如何从另一个文件运行 python 文件
    我正在尝试从另一个名为LoginOrReg的文件运行一个名为HabitTracker的python文件,但是当我这样做时,它会重新运行LoginOrReg文件。我已经尝试过这个classLoginOrReg:def__init__(self,db,cursor,login_username,data):self.db=mysql.connector.......
  • Python的字典和集合
    一、字典1.定义字典字典和列表虽然类似,但是字典是无序的可变序列,并且可以像查字典一样去查找。字典的元素都是成对出现的,每个元素都是由冒号“:”和键值对(“:”左边的称为键或者Key,“:”右边的称为值或者Value)构成的,用“{}”标识,元素之间用逗号“‘,”分隔。字典的键必须是唯一......
  • 在Python中字典是如何通过哈希表实现的以及哈希冲突是如何解决的
    哈希表(散列表)的工作原理哈希表是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。它通过哈希函数将输入的键(key)映射到表中的一个位置(即索引或槽位),从而以接近常数时间复杂度进行查找、插入和删除操作。哈希表的基本工作流程如下:哈希函数:哈希函数接受一个输入(键),并......
  • python cobs协议编解码算法demo
    1.SummaryCOBS(ConsistentOverheadByteStuffing)是一种算法,直译为一致的开销字节填充。简而言之,无论数据包的内容如何,都能通过产生高效可靠明确的数据包帧,从而使接受端能够从损坏的包中恢复。通常使用0x00来作为数据包的分隔符,即切割数据包的片分隔符。当使用0x00作为......
  • 如何将unicode编码为字节,以便可以检索到原始字符串?在Python 3.11中
    在python3.11中,我们可以对字符串进行编码,如:string.encode('ascii','backslashreplace')这对于说:hellö=>hell\\xf6但是当我插入时hellöw\\xf6rldIgethell\\xf6w\\xf6rld(注意第二个有一个看起来像字符转义序列的文字部分)......
  • python flask允许跨域
    flask接口支持跨域设置方法在Flask中,可以通过安装flask-cors扩展来支持跨域请求。下面是使用flask-cors扩展的示例代码:fromflaskimportFlaskfromflask_corsimportCORS#ipinstallflask-corsapp=Flask(__name__)CORS(app)可以通过CORS扩展的origins参数......
  • 在 Python 中动态定义文字字符串排列的并集
    我有一个字符串列表:strings=['a','b','c']我想声明列表中所有可能的有序对的Union类型。硬编码,这看起来像:Literal我如何动态定义CustomType=Literal['ab','ac','aa','ba','bb','bc�......
  • 关于 Python 中装饰器缓存的困惑
    我正在使用Python装饰器来实现函数的缓存。我了解缓存结果以提高性能的基本概念,但我正在努力解决如何处理不同的函数参数并确保底层数据更改时缓存更新。我已经实现了一个基本装饰器,它将函数结果存储在基于参数的字典。但是,此方法无法处理函数参数可能具有复杂结构(如嵌套列......
  • Python:__add__ 和 +,浮点数和整数的不同行为
    当将整数值添加到浮点值时,我意识到如果在浮点上调用该方法可以正常工作,例如:__add__但如果在整数上调用则不行:>>>n=2.0>>>m=1>>>n.__add__(m)3.0起初我认为|||只是对>>>m.__add__(n)NotImplemented和__add__类型的实现方式不同(例如f......