如果最终 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®=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
目标是通过美汤获得衣服的评分(星级)。
有关更清楚的细节,这是 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®=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