循环的网页抓取程序不返回任何内容



我开发了这个简单的网络抓取程序来抓取 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)

希望这能解决你的问题...

最新更新