Python Web Scraper问题

时间:2018-11-01 04:08:26

标签: python web-scraping

enter image description here我是编程和尝试通过构建一些小型辅助项目来学习的新手。我有此代码,并且可以正常工作,但是在提取所有信息时,在csv中正确格式化却存在问题。在我也增加了要拉价之后,它开始增加了怪异的空间。如果我注释掉价格并将其从写入中删除,它可以正常工作,但我不知道为什么重新添加时会出现奇怪的空格。

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

my_url = "https://www.newegg.com/Product/ProductList.aspx?Submit=ENE&N=-1&IsNodeId=1&Description=graphics%20card&bop=And&PageSize=12&order=BESTMATCH"


# Opening up 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"
f = open(filename, "w")

headers = "brand, product_name, 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

    shipping_container = container.findAll("li", {"class":"price-ship"})
    shipping = shipping_container[0].text.strip()

    price_container = container.findAll("li", {"class":"price-current"})
    price = price_container[0].text.strip()

    print("brand: " + brand)
    print("product_name: " + product_name)
    print("Price: " + price)
    print("shipping: " + shipping)


    f.write(brand + "," + product_name.replace(",", "|") + "," + shipping + "," + price + "\n")

f.close()

2 个答案:

答案 0 :(得分:4)

您可以像下面显示的那样写入csv文件。它产生的输出应达到目的。 Check out this documentation以获得清晰度。

import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup

my_url = "https://www.newegg.com/Product/ProductList.aspx?Submit=ENE&N=-1&IsNodeId=1&Description=graphics%20card&bop=And&PageSize=12&order=BESTMATCH"

page_html = urlopen(my_url).read()
page_soup = BeautifulSoup(page_html, "lxml")

with open("outputfile.csv","w",newline="") as infile:
    writer = csv.writer(infile)
    writer.writerow(["brand", "product_name", "shipping", "price"])

    for container in page_soup.findAll("div",{"class":"item-container"}):

        brand = container.find(class_="item-brand").img.get("title")
        product_name = container.find("a", {"class":"item-title"}).get_text(strip=True).replace(",", "|")
        shipping = container.find("li", {"class":"price-ship"}).get_text(strip=True)
        price = container.find("li", {"class":"price-current"}).get_text(strip=True).replace("|", "")

        writer.writerow([brand,product_name,shipping,price])

答案 1 :(得分:1)

您将获得换行符和垃圾邮件字符,因为这是您从BS4中获得的数据:它不是编写过程的产物。这是因为您试图获取列表项中的所有文本,而其中却有很多事情要做。看一下页面,如果您只想获取价格,则可以将列表中的Strong标签的文本与sup标签的文本连接起来,例如price = price_container[0].find("strong").text + price_container[0].find("sup").text。这样可以确保您只挑选所需的数据。