BeautifulsoupPython:如何刮取尚未加载的数据?

BeautifulsoupPython:如何刮取尚未加载的数据?,python,beautifulsoup,Python,Beautifulsoup,我尝试使用BeautifulSoup进行刮削,但它返回[]。然后,当我试图查看源代码时,出现了divclass=“loading32” 你怎么刮这种元素 from urllib.request import urlopen as uReq from bs4 import BeautifulSoup as soup my_url = productUrl # bs4 part uClient = uReq(my_url) # bs4 part page_html = uClient.read

我尝试使用BeautifulSoup进行刮削,但它返回
[]
。然后,当我试图查看源代码时,出现了div
class=“loading32”

你怎么刮这种元素

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

my_url = productUrl  # bs4 part
uClient = uReq(my_url)  # bs4 part
page_html = uClient.read()  # bs4 part
uClient.close()  # bs4 part
page_soup = soup(page_html, "html.parser")  # bs4 part
description = page_soup.findAll("div", {"class": "ui-box product-description-main"})
string4 = str(description)
网址:


产品说明

所以这里的问题是,这些
加载32
元素是通过客户端上编译的
javascript
加载的。这是
Splash
的理想用例
ScrapingHub
有这个
渲染器
,可以通过
curl API
使用,您还可以执行一些
Lua
代码,这可以帮助您避免很多问题,比如js触发的页面加载、等待、单击等等

链接:

此外,您还可以将此
Splash
Scrapy
集成,非常好


链接:

信息都在那里,不需要使用javascript。您只需查看返回的HTML,并确定提取所需每个项目的最佳方法。我猜您可能正在尝试获得以下内容:

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup 

my_url = 'https://www.aliexpress.com/store/product/100-Original-16-Shimano-Casitas-150-151-150hg-151hg-Right-Left-Hand-Baitcasting-Fishing-Reel-4/1053031_32657797704.html?spm=2114.12010608.0.0.22e12d66I7a3Dp'
uClient = uReq(my_url)  # bs4 part
page_html = uClient.read()  # bs4 part
uClient.close()  # bs4 part

soup = BeautifulSoup(page_html, "html.parser")  # bs4 part

details = {}
details['Product Name'] = soup.find('h1', class_='product-name').text
details['Price Range'] = soup.find('div', class_='p-current-price').find_all('span')[1].text

item_specifics = soup.find('ul', class_='product-property-list util-clearfix')
for li in item_specifics.find_all('li'):
    entry = li.get_text(strip=True).split(':')
    details[entry[0]] = ', '.join(entry[1:])

# Locate the image    
li = soup.find('div', class_='ui-image-viewer-thumb-wrap')
url = li.img['src']
details['Image URL'] = url
details['Image Filename'] = url.rsplit('/', 1)[1]

for item, desc in details.items():
    print('{:30} {}'.format(item, desc))
将向您提供以下信息:

产品名称原2016 Shimano Casitas 150 151 150hg 151hg左右抛饵钓鱼线轮4+1BB 5.5kg SVS无限钓鱼线轮
价格范围83.60-85.60
投饵钓鱼法
诱饵型假诱饵
定位海洋岩石渔业、河流、溪流、水库池塘、海洋海滩渔业、湖泊、海洋船渔业
钓鱼卷轴式鱼饵抛掷卷轴
型号Casitas
品牌名称Shimano
滚珠轴承4+1BB
功能1 Shimano稳定滑阀S3D
功能2 SVS无穷大制动系统(无穷大铸造控制)
型号150/151/150HG/151HG
PE线(50测试/米)20-150/30-135/40-105
尼龙线(51hg测试/米)10-120/12-110/14-90
重量190g
传动比6.3,1/7.2,1
马来西亚制造
图像URLhttps://ae01.alicdn.com/kf/HTB1qRKzJFXXXXboXVXXq6xXFXXXU/Original-2016-Shimano-Casitas-150-151-150hg-151hg-Right-Left-Hand-Baitcasting-Fishing-Reel-4-1BB.jpg_640x640.jpg
图像文件名Original-2016-Shimano-Casitas-150-151-150hg-151hg-Right-Left-Hand-Baitcasting-Fishing-Reel-4-1BB.jpg_640x640.jpg

图像信息也被存储。然后可以使用另一个
uReq
调用下载此文件,并使用获得的文件名将数据以二进制形式保存到文件中。

请将您的问题包括到目前为止尝试过的代码。您想用它提取什么?如何获取html源代码?该页面可能有动态javascript,在加载后更改html内容。如果您直接从服务器获取html时使用了类似于
请求
urlopen
的内容,则javascript永远不会执行。@MartinEvans的问题已被编辑,我正在通过BeautifulSoup@JohnGordon是的,我正在使用requests&urlopen,刚刚开始学习bs4。还有其他选择吗?但你想得到什么?各种各样的产品细节,图像?听起来很复杂。有没有办法使用bs4?没有。您需要使用浏览器或类似浏览器的东西获取代码,这样javascript代码就有机会执行。然后,您可以使用bs4分析结果。@JackAQ需要执行JS,因此,解决方案。我想这是回避这个问题的唯一办法。如果有帮助,请告诉我下面的图片如何?它们需要作为另一个请求下载并保存为二进制数据。我已经展示了一种获取图像细节的可能方法。
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup 

my_url = 'https://www.aliexpress.com/store/product/100-Original-16-Shimano-Casitas-150-151-150hg-151hg-Right-Left-Hand-Baitcasting-Fishing-Reel-4/1053031_32657797704.html?spm=2114.12010608.0.0.22e12d66I7a3Dp'
uClient = uReq(my_url)  # bs4 part
page_html = uClient.read()  # bs4 part
uClient.close()  # bs4 part

soup = BeautifulSoup(page_html, "html.parser")  # bs4 part

details = {}
details['Product Name'] = soup.find('h1', class_='product-name').text
details['Price Range'] = soup.find('div', class_='p-current-price').find_all('span')[1].text

item_specifics = soup.find('ul', class_='product-property-list util-clearfix')
for li in item_specifics.find_all('li'):
    entry = li.get_text(strip=True).split(':')
    details[entry[0]] = ', '.join(entry[1:])

# Locate the image    
li = soup.find('div', class_='ui-image-viewer-thumb-wrap')
url = li.img['src']
details['Image URL'] = url
details['Image Filename'] = url.rsplit('/', 1)[1]

for item, desc in details.items():
    print('{:30} {}'.format(item, desc))