【发布时间】:2018-05-19 23:23:11
【问题描述】:
目前我正在编写一些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ł
如您所见,如果我只添加一两个\ts 就可以了,但我认为这不是一个特别好的方法。
所以问题是:如何在不手动计算列中最长记录的大小的情况下以列方式对齐文本? (也许有一个标准的 lib 方式可以做到这一点,或者可能是 3rd 方 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()
【问题讨论】:
-
我将它们存储在我的自定义
Product类型对象列表中,这些对象具有两个属性:name和price -
是“可变长度列”还是“可变宽度列”?
-
您能否提供一个您尝试过的代码的简单示例?我相信您可以创建一个包含两个成员的简单类。
-
但我确实创建了一个类。更新了问题
-
您能否详细说明为什么您不能接受固定宽度的解决方案?您是否希望列宽尽可能大以适合整个字符串?
标签: python printing formatting