【问题标题】:How to print a good looking list with or without pandas while scraping with selenium?如何在使用硒刮擦时打印带有或不带有熊猫的漂亮列表?
【发布时间】:2021-06-28 19:20:14
【问题描述】:
import pandas as pd
import geocoder
from selenium import webdriver
import csv

g = geocoder.ip('me')
print(g.latlng)

driver = webdriver.Chrome(executable_path=r'D:\chromedriver.exe')
driver.get("https://prisguiden.no/kategorier/mobiltelefon")

variant = driver.find_element_by_class_name("category-results").text
pris = driver.find_element_by_class_name ("price-low")

print (variant)

这为我提供了我想要的所有信息,但这并不是我数据的一个很好的展示。 我用谷歌搜索了一些熊猫列表,但它不起作用,最后我想将我的数据导出到 excel 或类似的可读表中。

【问题讨论】:

  • “它只是不能很好地展示我的数据”——它究竟打印的是什么,您希望它采用什么格式?
  • 嗯,它的 python 打印,所以 ABC123 或 A1B2C3 等。而不是像:A 1 B 2 C 3 列或行。

标签: python pandas selenium selenium-webdriver export-to-csv


【解决方案1】:

如果我理解正确,您想从网页中抓取一些数据并进行清理,使其成为可用的格式。

您抓取的数据是一组手机,您可以将它们按品牌名称分开,然后从中找到提取每部手机的属性。每部手机的属性数量并不总是相等,因此需要一些摆弄 ...

这是一个开始

import pandas as pd 
from selenium import webdriver 


def get_data():
    driver = webdriver.Chrome(executable_path=r'<pathtodriver>') 
    driver.get("https://prisguiden.no/kategorier/mobiltelefon")

    variant = driver.find_element_by_class_name("category-results").text 
    pris = driver.find_element_by_class_name ("price-low")

    return variant.split("\n")


def split_data(txt):
    brand = ["Apple", "Sony", "Samsung", "Huawei", "Xiaomi", "OnePlus"]
    prods = []
    prod = []
    for item in txt:
        if item in brand:
            if len(prod) > 0:
                prods.append(prod)
            prod = [item]
        else:
            prod.append(item)
    return prods


class Product:
    def __init__(self, *args):
        self.brand = args[0]
        self.model = args[1]
        self.spec = args[2]
        self.price = [a for a in args if 'priser' in a][0]
        self.other_info = [a for a in args 
                           if a not in (self.brand,
                                        self.model,
                                        self.spec,
                                        self.price)]

if __name__ == "__main__":
    data = get_data()
    li = split_data(data)
    df = pd.DataFrame([Product(*l).__dict__ for l in li])
    print(df)

【讨论】:

  • 感谢您的回复,我会测试一下。
  • 当你这样做时 [] 就像在 f.ex 中一样; prods = [] - 当它没有任何信息时它会做什么?
  • @larsmath 不确定我明白你的意思吗?您可以检查一下 data 不是 None 吗?
  • prods = [] prod = [] 这些是什么意思,还是空白让我填写?
  • @larsmath get_data() 使用您的代码抓取网页并返回数据项列表。如果您print(get_data()),您将看到与网页上列出的每部手机对应的数据。对于每部手机,第一个数据项是品牌名称。我认为这是拆分数据的好方法。因此split_data() 获取数据项列表并将其转换为列表列表,其中与不同手机相关的项目位于不同列表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
相关资源
最近更新 更多