python - 从跨度标签获取文本时返回空列表(网络抓取)
问题描述
我正在尝试从此 URL 获取产品价格和名称。
当我检查 HTML 元素时,产品的价格在一个span
带有 class name 的标签下c13VH6
。
但是,我得到一个空字符串。
下面是我的代码。
import requests
from bs4 import BeautifulSoup
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
html_text=requests.get('https://www.daraz.com.np/televisions/?
spm=a2a0e.11779170.cate_3.1.287d2d2bmERvcc',headers=headers).text
soup=BeautifulSoup(html_text, 'lxml')
#soup = BeautifulSoup(html_text, 'html5lib')
string1=soup.find('span',class_='c13VH6')
print(soup.find('span', class_='c13VH6'))
print(string1)
解决方案
该网站是动态加载的,因此该requests
模块不支持它。但是,数据以 JSON 格式嵌入网站中,您可以使用内置re
(regex) 模块查找数据,并将其转换为 Python 字典(dict)
并使用内置模块访问key
/ 。value
json
例如,要打印所有产品名称和价格:
import json
import re
import requests
from bs4 import BeautifulSoup
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
}
url = "https://www.daraz.com.np/televisions/?spm=a2a0e.11779170.cate_3.1.287d2d2bmERvcc"
soup = BeautifulSoup(requests.get(url, headers=headers).content, "lxml")
json_data = json.loads(re.search("window\.pageData=({.*})", str(soup)).group(1))
# To view all the JSON data:
# print(json.dumps(json_data, indent=3))
for data in json_data["mods"]["listItems"]:
print(data["name"])
print(data["priceShow"].split()[1])
print("-" * 80)
输出:
SONY Klv-32W602D 32 Class Hdr Led Smart Tv - (Black)"
59,500
--------------------------------------------------------------------------------
SONY Bravia Klv32R302E 32" Hd Led Tv
48,000
--------------------------------------------------------------------------------
Samsung Ua49N5300Arshe 49 Inch Full Hd Smart Led Tv - Black
87,290
--------------------------------------------------------------------------------
X96 Mini, Android Box, Make Your Any TV Smart & 4K
4,200
--------------------------------------------------------------------------------
Sansui 43S803A 43 Inch Screen 1080P Led Tv
50,369
--------------------------------------------------------------------------------
Samsung Ua49Nu7100Rshe 49 Inch 4K Ultra Hd Smart Led Tv - Black
128,690
--------------------------------------------------------------------------------
...
...
推荐阅读
- python - 用于读取 excel 文档并验证扫描文书工作的信息是否在列表中的 Python 代码,然后将不同文件中的项目分开
- javascript - 使用 array.reduce 计算对象数组中的出现次数
- python - 在 python 中使用 OrderedDict 元素拆分 csv 文件
- elasticsearch - Kibana 显示您看到的数据可能不完整或错误
- spring-boot - Embedded Tomcat Hardening - 如何将 NONDETERMINISTICVALUE 设置为关闭命令值?
- javascript - 如何动态更改处于 React 状态的对象的值
- javascript - Vue beforeRouteEnter 等待子组件完成请求
- python - 如何使用 NetworkX 的 rescale_layout?
- firebase - 如何从 firebase 获取图像/文件列表?
- python - Python:解析 Json 以查找匹配几个键的匹配行