我的结果是空的,不确定我的代码出了什么问题:
这里是我的代码:
#尝试从该网站获取数据 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 源代码,找到包含产品名称和价格的正确元素和类名。
以下是如何调试代码并找到正确选择器的步骤:
-
打印
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
的文件中。
-
在
-
在浏览器中打开
watsons_page.html
文件并检查:- 使用浏览器的开发者工具(通常按 F12 键打开)检查 HTML 代码,找到包含产品名称和价格的元素。
- 确定这些元素的标签名称、类名或其他唯一标识符。
-
更新代码以使用正确的选择器:
-
将
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