我开发了这个简单的网络抓取程序来抓取 newegg.com。我做了一个 for 循环来打印出产品名称、价格和运费。
但是,当我运行 for 循环时,它不会打印出任何内容,也不会给我任何错误。在我编写 for 循环(注释项)之前,我已经运行了这些行(注释项),它只打印其中一个产品的详细信息。
from bs4 import BeautifulSoup
import requests
import csv
source = requests.get('https://www.newegg.com/PS4-Systems/SubCategory/ID-3102').text
soup = BeautifulSoup(source, 'lxml')
#prod = soup.find('a', class_='item-title').text
#price = soup.find('li', class_='price-current').text.strip()
#ship = soup.find('li', class_='price-ship').text.strip()
#print(prod.strip())
#print(price.strip())
#print(ship)
for info in soup.find_all('div', class_='item-container '):
prod = soup.find('a', class_='item-title').text
price = soup.find('li', class_='price-current').text.strip()
ship = soup.find('li', class_='price-ship').text.strip()
print(prod.strip())
#price.splitlines()[3].replace('xa0', '')
print(price.strip())
print(ship)
少写代码:
from bs4 import BeautifulSoup
import requests
source = requests.get('https://www.newegg.com/PS4-Systems/SubCategory/ID-3102').text
soup = BeautifulSoup(source, 'lxml')
for info in soup.find_all('div', class_='item-container '):
print(info.find('a', class_='item-title').text)
print(info.find('li', class_='price-current').text.strip())
print(info.find('li', class_='price-ship').text.strip())
除了"空格"拼写错误和缩进之外,您实际上并没有在 for 循环中使用info
。这将只继续打印第一项。在 for 循环中使用 info
soup
。
from bs4 import BeautifulSoup
import requests
import csv
source = requests.get('https://www.newegg.com/PS4-Systems/SubCategory/ID-3102').text
soup = BeautifulSoup(source, 'lxml')
for info in soup.find_all('div', class_='item-container'):
prod = info.find('a', class_='item-title').text.strip()
price = info.find('li', class_='price-current').text.strip().splitlines()[1].replace(u'xa0', '')
if u'$' not in price:
price = info.find('li', class_='price-current').text.strip().splitlines()[0].replace(u'xa0', '')
ship = info.find('li', class_='price-ship').text.strip()
print(prod)
print(price)
print(ship)
因为您的代码没有在下面的代码中使用info
for info in soup.....:
而是soup.find(..)
,它只会继续寻找第一次出现,例如 soup.find('a', class_='item-title')
.如果使用 info.find(....)
它将在 for 循环的每个循环中使用下一个 <div>
元素。
编辑:我还发现,当您使用.splitlines()
时,价格并不总是第二项,有时它是第一项。因此,我添加了一个检查,以查看该项目是否包含"$"符号。如果没有,则使用第一个列表项。
@Rick您错误地在属性值后的此行中添加了额外的空格for info in soup.find_all('div', class_='item-container '):
检查下面的代码,它将按您的预期工作
from bs4 import BeautifulSoup
import requests
import csv
source = requests.get('https://www.newegg.com/PS4-Systems/SubCategory/ID-3102').text
soup = BeautifulSoup(source, 'lxml')
for info in soup.find_all('div', class_='item-container '):
prod = soup.find('a', class_='item-title').text
price = soup.find('li', class_='price-current').text.strip()
ship = soup.find('li', class_='price-ship').text.strip()
print(prod.strip())
print(price.strip())
print(ship)
希望这能解决你的问题...