Как распечатать список вещей в столбцах? - PullRequest
0 голосов
/ 20 мая 2018

В настоящее время я работаю над кодом selenium и написал код, чтобы просто перейти на какой-либо веб-сайт, найти несколько продуктов и затем перечислить их.Все работает хорошо, кроме одной вещи.Я хочу напечатать продукты в следующем формате:

 1. <name>\t<price>
 2. <name>\t<price> ...

Проблема в том, что названия некоторых продуктов (в моем конкретном случае одного из них) длиннее других, что приводит к выводу, подобному следующему:

1. Nóż Benchmade 62 Balisong    1 275,00 zł
2. Nóż Benchmade 63 Balisong Bowie      1 290,00 zł
3. Nóż Benchmade 67 Balisong    1 295,00 zł
4. Nóż Benchmade 87 Ti Balisong 2 235,00 zł

Как видите, если я просто добавлю одну или две \t с, все будет в порядке, но я не думаю, что это особенно хороший способ сделать это.

Таким образом, вопрос заключается в следующем: как выровнять текст по столбцам, не вычисляя вручную размер самой длинной записи в столбце?(Может быть, есть стандартный lib-способ сделать это, или, может быть, сторонний lib?)

Редактировать: я добавил код:

from selenium import webdriver

class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def __str__(self):
        return f'{self.name}\t{self.price}'

    def __repr__(self):
        return f'Product({self.name})'        

def search_for(driver, input_name, query):
    search_field = driver.find_element_by_name(input_name)
    search_field.clear()
    search_field.send_keys(query)
    search_field.submit()


def create_products(driver):
    found_elements = driver.find_elements_by_xpath("//div[@class='wrapper']")
    names = [
        fe.find_element_by_xpath(".//img[@alt]").get_attribute("alt")
        for fe in found_elements
    ]
    products = []
    int_parts = driver.find_elements_by_xpath(
        "//span[@class='price']/span[@class='price-integer-part']")
    decimal_parts = driver.find_elements_by_xpath(
        "//span[@class='price']/span[@class='price-decimal-part']")
    currencies = driver.find_elements_by_xpath(
        "//span[@class='price-currency']")
    for info in zip(names, int_parts, decimal_parts, currencies):
        name, int_part, decimal_part, currency = info
        price = f'{int_part.text},{decimal_part.text} {currency.text}'
        products.append(Product(name, price))
    return products


def main():
    driver = webdriver.Chrome()
    driver.implicitly_wait(30)
    driver.maximize_window()

    driver.get('https://kolba.pl')
    search_for(driver, 'query', 'benchmade balisong')
    products = create_products(driver)
    print(f'Found {len(products)} products:\n')
    for i, product in enumerate(products):
        print(f'{i+1}. {product}')


if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 20 мая 2018

Я сам нашел ответ: humanfriendly библиотека.

Только что добавил этот код:

from humanfriendly.tables import format_pretty_table

Изменил мой Product класс на:

class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def __str__(self):
        return f'{self.name}\t{self.price}'

    def __repr__(self):
        return f'Product({self.name})'

    def __iter__(self):
        return iter((self.name, self.price))

И распечатал его:

column_names = ['Name', 'Price']
print(format_pretty_table(products, column_names))

, где products - список объектов типа Product.

Учитывая вывод:

-------------------------------------------------
| Name                            | Price       |
-------------------------------------------------
| Nóż Benchmade 62 Balisong       | 1 275,00 zł |
| Nóż Benchmade 63 Balisong Bowie | 1 290,00 zł |
| Nóż Benchmade 67 Balisong       | 1 295,00 zł |
| Nóż Benchmade 87 Ti Balisong    | 2 235,00 zł |
-------------------------------------------------

И мне не нужно было использовать строки фиксированного размера (общий объем отходов, и это выглядит просто некрасиво), плюс мне не пришлось вычислять вручную.Так что я думаю, что это будет ответом на мой вопрос, так рад найти эту библиотеку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...