如果最终 html 被 javascript 隐藏,如何用漂亮的汤解析 span?

How to parse span with beautiful soup if in final html it's hidden by javascript?

目标是通过美汤获得衣服的评分(星级)。

有关更清楚的细节,这是 python 代码的一部分,过去它有效:

    url = f"https://www.wildberries.ru/catalog/18645227/detail.aspx?targetUrl=IN"
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser') 
    print(soup)
    rating = soup.find('span', {'data-link': 'text{: product^star}'})

in inspector google chrome 可以看到 html:

<span data-link="text{: product^star}">5</span>

但如果通过打印(或通过 chrome 中的查看源)查看它:

print(soup)

我们不会看到这样的东西:

 <span data-link="text{: product^star}">5</span>

在 html 的那个地方(通过 print(soup))在 html 中必须是正文的地方我可以看到类似反应的东西:

    <div id="mainContainer" class="main__container">
    
    <div id="app">
    </div>

    <button class="btn-quick-nav j-quicknav" type="button">to the 
    top</button>

    </div>

还有一大堆 javascript 页脚的东西,所以我无法拉动那个跨度

具体url例如:

https://www.wildberries.ru/catalog/18645227/detail.aspx?targetUrl=IN

具体解析

<span data-link="text{: product^star}">4</span>

是否是新的技术组合代码防止解析)? 有什么方法可以让“老派 html”)?

简短的回答是你不能解析and/or用bs4获取数据。

正如您所注意到的,产品的所有数据都是动态生成的,这意味着您需要有一种 运行 JavaScript 的方法,而 bs4 没有.

如果您想获得 老派 HTML,请使用 selenium 等自动化工具,例如 Chrome driver

但是,如果您知道产品的 ID,则 无需 selenium 即可获取数据。

这是一个例子(产品 ID 是 url nm=51728993 中的最后一个值):

import requests

url = "https://wbxcatalog-ru.wildberries.ru/nm-2-card/catalog?spp=0&pricemarginCoeff=1.0&reg=0&appType=1&emp=0&locale=ru&lang=ru&curr=rub&nm=51728993"

headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:100.0) Gecko/20100101 Firefox/100.0"
}
data = requests.get(url, headers=headers).json()["data"]["products"][0]
print(f"{data['name']}\n{data['rating']} stars from {data['feedbacks']} reviews.")

输出:

Смартфон Poco M4 Pro / 6.6'' / 1080x2400 / IPS / 8 ГБ / 128 ГБ / 5000 мА*ч
5 stars from 414 reviews