首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据刮除Python漂亮的汤代码不循环

数据刮除Python漂亮的汤代码不循环
EN

Stack Overflow用户
提问于 2021-12-08 13:40:51
回答 1查看 192关注 0票数 -1

我在努力搜集数据。不知怎么循环不能正常工作。它只循环一次。我想弄清楚货物的名称和价格。

货物在"td“例如:"Sendok精液7 Bulat”内,价格在"div“例如:"8.500”内。

这是我的代码:

代码语言:javascript
运行
复制
import requests
from bs4 import BeautifulSoup
url = 'https://www.ralali.com/search/semen'
res = requests.get(url)
html = BeautifulSoup(res.content,"html.parser")
#divs = html.find_all('div', class_ = "col-md-12 col-xs-12") 
divs = html.findAll('div', class_ = "row d-block")
cnt = 0

for div in divs:
  cnt += 1
  #print(div, end="\n"*2)
  price = div.find('span', class_ = 'float-right')
  print(price.text.strip())
  print(cnt)

任何帮助都将不胜感激。谢谢

EN

回答 1

Stack Overflow用户

发布于 2021-12-09 19:06:07

会发生什么?

不知何故循环不能正常工作。它只循环一次。

不是循环不能正常工作,而是你选择事物的方式。因此,html.findAll('div', class_ = "row d-block")只会找到一个与您的标准相匹配的<div>

怎么修?

让您选择的更具体,因为您真正想要迭代的是表中的<tr> --我经常使用css selectors,下面将得到正确的选择,所以只需在新代码中替换html.findAll('div', class_ = "row d-block") Note --使用find_all()而不是findAll() --这是较新的语法:

代码语言:javascript
运行
复制
html.select('.d-block tbody tr')

示例

会给你一个结构良好的字典列表:

代码语言:javascript
运行
复制
import requests
from bs4 import BeautifulSoup
url = 'https://www.ralali.com/search/semen'
res = requests.get(url)
html = BeautifulSoup(res.content,"html.parser")

data = []
for row in html.select('.d-block tbody tr'):
    data.append(
        dict(
            zip(['pos','name','currency','price'],list(row.stripped_strings))
        )
    )
data

输出

代码语言:javascript
运行
复制
[{'pos': '1',
  'name': 'Sendok Semen 7 Bulat',
  'currency': 'Rp',
  'price': '8.500'},
 {'pos': '2',
  'name': 'Sendok Semen 8 Bulat Gagang Kayu',
  'currency': 'Rp',
  'price': '10.000'},
 {'pos': '3', 'name': 'SEMEN', 'currency': 'Rp', 'price': '10.000'},
 {'pos': '4',
  'name': 'Sendok Semen 8 Gagang Kayu SWARDFISH',
  'currency': 'Rp',
  'price': '10.000'},...]

但要注意

这只会帮助你获得前10名的流行精液价格在拉拉利,而不是所有的商品和价格在网页上->这是你应该澄清在你的问题。

从所有产品获取更多数据

Option#1

使用由网站提供并按参数页迭代的api:

代码语言:javascript
运行
复制
import requests

url = 'https://rarasearch.ralali.com/v2/search/item?q=semen'
res = requests.get(url)

data = []

for p in range(1, round(res.json()['total_item']/20)):
    url = f'https://rarasearch.ralali.com/v2/search/item?q=semen&p={p}'
    res = requests.get(url)
    data.extend(res.json()['items'])

print(data)

输出:

代码语言:javascript
运行
复制
[{'id': 114797,
  'name': 'TIGA RODA Semen NON semen putih',
  'image': 'assets/img/Libraries/114797_TIGA_RODA_Semen_NON_semen_putih_1_UrwztohXHo9u1yRY_1625473149.png',
  'alias': 'tiga-roda-semen-non-semen-putih-157561001',
  'vendor_id': 21156,
  'vendor_alias': 'prokonstruksi',
  'rating': '5.00',
  'vendor_status': 'A',
  'vendor_name': 'Pro Konstruksi',
  'vendor_location': 'Palembang',
  'price': '101500.00',
  'discount': 0,
  'discount_percentage': 0,
  'free_ongkir_lokal': 0,
  'free_ongkir_nusantara': 1,
  'is_stock_available': 1,
  'minimum_order': 1,
  'maximum_order': 999999999,
  'unit_type': 'unit',
  'ss_type': 0,
  'is_open': 'Y',
  'wholesale_price': []},
 {'id': 268711,
  'name': 'Sendok Semen Ukuran 6',
  'image': 'assets/img/Libraries/268711_Sendok-Semen-Ukuran-6_HCLcQq6TUh5IiEPZ_1553521818.jpeg',
  'alias': 'Sendok-Semen-Ukuran-6',
  'vendor_id': 305459,
  'vendor_alias': 'distributorbangunan',
  'rating': None,
  'vendor_status': 'A',
  'vendor_name': 'Distributor Bangunan',
  'vendor_location': 'Bandung',
  'price': '11000.00',
  'discount': 0,
  'discount_percentage': 0,
  'free_ongkir_lokal': 0,
  'free_ongkir_nusantara': 0,
  'is_stock_available': 1,
  'minimum_order': 1,
  'maximum_order': 999999999,
  'unit_type': 'Unit',
  'ss_type': 0,
  'is_open': 'Y',
  'wholesale_price': []},...]

Option#2

使用selenium,滚动到页面底部加载所有产品,将driver.page_source推送到您的soup并开始选择,

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70275983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档