【问题标题】:Unable to scrap promotion price details from website无法从网站上删除促销价格详细信息
【发布时间】:2022-02-03 11:53:30
【问题描述】:

我正在尝试从https://www.fairprice.com.sg/product/magnolia-fresh-milk-1lt-13022014 删除促销价格详细信息

具体来说,我正在尝试取消“Any 2 for $5.45,Save $1.55”的信息。当我运行下面的代码时,它给了我一个空返回。

在同一网站的其他产品上使用相同的代码虽然有效(例如https://www.fairprice.com.sg/product/kirei-kirei-hand-soap-rfl-moisturing-peach-200ml-12089153

不确定导致行为差异的原因。感谢您对此问题的任何建议。

import sys
import time
from bs4 import BeautifulSoup
import requests
import re
    
try:
    url = 'https://www.fairprice.com.sg/product/magnolia-fresh-milk-1lt-13022014'
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 Edg/97.0.1072.69'}
    page=requests.get(url, headers=headers)
except Exception as e:
    error_type, error_obj, error_info = sys.exc_info()
    print ('ERROR FOR LINK:', url)
    print (error_type, 'Line:', error_info.tb_lineno)
    
time.sleep(2)
soup=BeautifulSoup(page.text,'html.parser')
linkpromo=soup.find_all('span',attrs={'class':'sc-1bsd7ul-1 eSToaS'},string=re.compile(r'Any'))   

print(linkpromo) 

【问题讨论】:

  • 您要查找的内容实际上并未加载到页面上。如果您在尝试查找所需信息之前打印您的汤对象,您将不会看到它作为跨度的一部分,就像您在浏览器上看到的那样。但是您可以在页面上的最终脚本标记中看到该信息

标签: python html web-scraping beautifulsoup python-requests


【解决方案1】:

数据是动态加载的,因此您要查找的数据不在返回的 html 中。您可以使用requests-html 包来呈现页面。请参阅下面的示例

from requests_html import HTMLSession   

url = 'https://www.fairprice.com.sg/product/magnolia-fresh-milk-1lt-13022014'
session = HTMLSession()
r = session.get(url)
r.html.render(timeout=20)

linkpromo=r.html.xpath("//div[@data-testid='offer-details'][last()]/div/span/text()")

print(linkpromo) 

您将在终端中获得以下输出:

['Any 2 for $5.45, Save $1.55']

【讨论】:

  • 我正在尝试从同一页面中提取价格“S3.50”和产品名称“F&N Magnolia Fresh Milk”。正确的 xpath 链接应该是什么?当我尝试提供从开发者工具获得的完整 xpath 链接时,它不起作用。
  • 数据包含在 html 中的 script 标签中。您在页面上看到的内容是通过 javascript 加载的。要获取名称和价格,您可以解析脚本标签中的文本,然后将其解析为 json。请参阅此link 的示例,了解您可以执行的操作。 json_data 对象包含您可能需要的所有信息。
  • 它有效。感谢您的所有帮助。在这方面有很多值得学习的地方。
  • 从链接中抓取 Javascript 内容的代码似乎适用于该特定产品。当我将它应用于不同的产品(例如 fairprice.com.sg/product/… )时,它似乎不起作用。试图获得“Zespri New Zealand Kiwifruit - Green”的名称
猜你喜欢
  • 1970-01-01
  • 2022-10-13
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多