Python 网页抓取的所有工作应但我有一个终端底部的错误
我创建了我的第一个网页抓取程序。一切正常,但终端底部有一个错误,我想了解它显示的问题,以及如何消除它,使其在将来不再显示Python 网页抓取的所有工作应但我有一个终端底部的错误,python,web-scraping,beautifulsoup,Python,Web Scraping,Beautifulsoup,我创建了我的第一个网页抓取程序。一切正常,但终端底部有一个错误,我想了解它显示的问题,以及如何消除它,使其在将来不再显示 from urllib.request import urlopen as uReq from bs4 import BeautifulSoup as soup my_url = 'https://www.newegg.com/Video-Cards-Video-Devices/Category/ID-38?Tpk=graphics+cards' # opening the
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
my_url = 'https://www.newegg.com/Video-Cards-Video-Devices/Category/ID-38?Tpk=graphics+cards'
# opening the connection, grabbing the page
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()
#html parsing
page_soup = soup(page_html, "html.parser")
#grabs each products
containers = page_soup.findAll("div", {"class":"item-container"})
filename = "products.csv"
# the "w" means write and
# "f" is the normal convention for a file writer
f = open(filename, "w")
headers = "brand, product_name, price, shipping\n"
f.write(headers)
for container in containers:
brand = container.div.div.a.img["title"]
title_container = container.findAll("a", {"class":"item-title"})
product_name = title_container[0].text
sales_main_container = container.findAll("ul", {"class":"price"})
sales_container = sales_main_container[0]
part_one_price = sales_container.find("strong").text
part_two_price = sales_container.find("sup").text
price = part_one_price + part_two_price
shipping_container = container.findAll("li", {"class":"price-ship"})
shipping = shipping_container[0].text.strip()
print("brand: " + brand)
print("product_name: " + product_name)
print("price: " + price)
print("shipping: " + shipping)
f.write(brand + "," + product_name.replace(",", "|") + "," + price.replace(",", "|") + "," + shipping + "\n")
f.close()
但为了以防万一,点击链接是一个问题:
以下是错误:
回溯(最近一次呼叫最后一次):
文件“c:/Users/12082/Documents/Python/web\u scrape/web\u scraping.py”,第33行,在
part_one_price=销售_容器。查找(“强”)。文本
AttributeError:“非类型”对象没有属性“文本”
以下是它在我的终端中的显示方式,这也是我的意图:
品牌:千兆字节
产品名称:GB GeForce RTX 2070超级游戏OC 3X 8G图形卡,GV-N207SGAMING OC-8GD
售价:549.99
航运:免费航运
品牌:EVGA
产品名称:EVGA GeForce GTX 1660 Ti XC游戏,06G-P4-1263-KR,6GB GDDR6,HDB风扇
售价:289.99
运费:3.99美元运费
品牌:千兆字节
产品名称:GB GeForce GTX 1660 SUPER DirectX 12 GV-N166SOC-6GD视频卡
售价:239.99
航运:免费航运
品牌:MSI
产品名称:MSI GeForce RTX 2060 DirectX 12 RTX 2060 VENTUS XS 6G OC视频卡
售价:339.99
航运:免费航运
品牌:华硕
产品名称:华硕ROG Strix Radeon RX 5700 XT ROG-Strix-RX5700XT-O8G-游戏视频卡
价格:459.99
航运:免费航运
品牌:EVGA
产品名称:EVGA GeForce GTX 1660 SC ULTRA GAMING,06G-P4-1067-KR,6GB GDDR5,双风扇,金属背板
售价:239.99
航运:免费航运
品牌:蓝宝石科技
产品名称:蓝宝石脉冲Radeon RX 5700 XT 100416P8GL视频卡
售价:399.99
航运:免费航运
品牌:MSI
产品名称:MSI GeForce GTX 1660 DirectX 12 GTX 1660 VENTUS XS 6G OC视频卡
价格:216.95
航运:免费航运
品牌:千兆字节
产品名称:GB Radeon RX 5700 XT DirectX 12 GV-R57XTGAMING-8GD视频卡
售价:409.99
航运:免费航运
品牌:XFX
产品名称:XFX Radeon RX 5600 XT RX-56XT6DF46视频卡THICC II PRO-14GBPS 6GB高达1620M D6 3xDP HDMI
价格:299.99
航运:免费航运
品牌:阿斯洛克
产品名称:ASRock Radeon RX 5700 XT DirectX 12 RX 5700 XT TAICHI X 8G OC+视频卡
售价:429.99
航运:免费航运
但是,粘贴到这里显示的内容并不相同,因此如果需要查看,我建议单击此链接
excel文件实际上无法粘贴到文本中。您的代码在第33行出现异常(在某些情况下,第34行也可能出现异常):
part\u one\u price=sales\u container.find(“strong”).text
第二部分价格=销售容器。查找(“sup”)。文本
实际上,您的循环中有一些sales\u container
实例没有预期的
和/或
标记。由于此sales\u容器。find(“strong”)
将返回None
,此数据类型没有属性。text
因此会引发异常,因为在这些情况下,您基本上是说part\u one\u price=None。text
无效
为了降低这种风险,可以使用以下代码(替换原始帖子中的第33-35行):
try:#尝试从销售容器中定价和
part_one_price=销售_容器。查找(“强”)。文本
第二部分价格=销售容器。查找(“sup”)。文本
除非异常为e:#如果引发异常
print(f“{product_name}:{e}”)#将产品名称后跟异常打印到控制台
part_one_price=“无法解析价格”#将未找到价格消息分配给var
part_two_price=”“#将部分价格更改为从上一循环清除的空字符串
最后:#一旦尝试或例外完成
价格=第一部分价格+第二部分价格#将价格的两部分合并以备日后使用
您的代码中还有其他一些方面可能需要进行异常处理,以便在运行时以错误的方式访问
None
值时不停止解释器,如本例所示。请发布文本而不是图像,以获取错误消息等。老兄,说真的,您否决了它,因为有图片??excel文件pice不会以有益的方式转换为文本。使用调试器查找None
值的原因我使用了它,它说part\u one\u price和part\u two\u price没有属性“text”,我不明白为什么它会出现此错误,我不知道应该如何更改这些变量。在这个脚本的价格部分之前,我一直在关注一个视频,在这个主题中我对python一无所知。我只知道基本的自动取款机