小编Gra*_*ex.的帖子

进行设置差异时忽略最后一个元素的 Pythonic 方式

假设我有两个set()

a = {('1', '2', '3', 'a'), ('1', '2', '4', 'a'), ('1', '2', '5', 'b')}
b = {('1', '2', '3', 'b'), ('1', '2', '4', 'b'), ('1', '2', '6', 'b')}
Run Code Online (Sandbox Code Playgroud)

现在,我想要做的是找到集差b \ a但忽略每个元组中的最后一个元素。所以这就像做这样的事情:

a = {('1', '2', '3'), ('1', '2', '4'), ('1', '2', '5')}
b = {('1', '2', '3'), ('1', '2', '4'), ('1', '2', '6')}

In[1]: b - a
Out[1]: {('1', '2', '6')}
Run Code Online (Sandbox Code Playgroud)

预期输出:

b \ a = {('1', '2', '6', 'b')}

是否有任何明显的/pythonic 方法可以实现这一点,而无需手动迭代每个集合并检查每个集合tuple[:3]

python set python-2.7

12
推荐指数
1
解决办法
668
查看次数

使用Scrapy时了解无限加载-怎么了?

语境

我试图从该网站获取所有数据,以便以后在某些模型训练项目(ML)中使用它。

我选择使用Scrapy + Python 3.7来做到这一点。到目前为止,一切都很好。我已经建立了Scrapy项目结构,并开始研究刮板。为此,我创建了一些步骤,必须遵循这些步骤才能相应地获取所需的数据。

脚步

  1. 首先,我们可以看到,在访问站点的站点地图时,我们可以获得所需的所有类别。(也有直接的“ 产品”页面,但是很遗憾,无法以这种方式获取类别,因此这不是解决方案)。

在此处输入图片说明

  1. 现在,我们需要做的是访问每个子类别,这将带我们进入“产品”页面(无限加载所在)。我以第一个子类别为例。

在此处输入图片说明

  1. 向下滚动浏览产品时,我们可以看到我们的负载无限大,并且正在提出将更多产品放入前端的请求:

在此处输入图片说明

  1. 最后,单击每个产品并从中获取一些数据(该部分与我要的内容无关,因此您可以Product从下面粘贴的代码中跳过该类)

我试图通过使用以下代码来重现以上内容:

import json
import re

import scrapy


PRODUCTS_XPATH = "//div[@class='col-md-3']//a/@href"


class Product:
    def __init__(self, response):
        self.response = response

    def get_brand_name(self):
        brand_name = self.response.xpath(
            "normalize-space(//*[@class='product-brand-name-details']/text())"
        ).extract()
        if not brand_name[0]:
            brand_name = self.response.xpath(
                "normalize-space(//h3[@class='font-weight-bold']/text())"
            ).extract()
        return brand_name[0] if brand_name else 'Could not get product brand name.'

    def get_brand_name_details(self):
        brand_name_details = self.response.xpath(
            "normalize-space(//*[@class='product-name-details']/text())"
        ).extract()
        if not brand_name_details[0]:
            brand_name_details = self.response.xpath(
                "normalize-space(//h1[@class='title …
Run Code Online (Sandbox Code Playgroud)

python scrapy web-scraping python-3.x infinite-scroll

5
推荐指数
1
解决办法
104
查看次数

在 Python 中使用 Fernet 进行对称加密 - 主密码用例

我一直在尝试了解对称加密的工作原理以及如何将其集成到我的 CLI 应用程序中,但我遇到了一些我将在下面描述的问题。

我的用例如下:

  • 我有一个CLI应用程序(SQLAlchemy+ click+ Python 3.8),这将是一个非常简单的密码管理器(自用)。

  • 开始时,我想向用户询问主密码,以便他能够从数据库中检索任何信息。如果用户还没有主密码,我会请他创建一个。我希望所有数据都使用相同的主密钥进行加密。

为了完成上述所有工作,我认为对称加密是最合适的,因此想到了Fernet,所以我开始编写一些代码:

import base64

from cryptography.fernet import Fernet, InvalidToken
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC


def generate_key_derivation(salt, master_password):
    kdf = PBKDF2HMAC(
        algorithm=hashes.SHA256(),
        length=32,
        salt=salt,
        iterations=100000,
        backend=default_backend()
    )
    key = base64.urlsafe_b64encode(kdf.derive(master_password.encode()))
    return key


def encrypt(key, value_to_encrypt):
    f = Fernet(key)
    encrypted_key = f.encrypt(value_to_encrypt.encode())
    return encrypted_key


def decrypt(key, encrypted_key):
    f = Fernet(key)
    try:
        return f.decrypt(encrypted_key)
    except InvalidToken:
        return b''
Run Code Online (Sandbox Code Playgroud)

现在,我有点试图从文档中理解:

在这个方案中,盐必须存储在一个可检索的位置,以便将来从密码中导出相同的密钥。 …

python encryption sqlalchemy encryption-symmetric

5
推荐指数
1
解决办法
1469
查看次数

如何在 Python 中检索 Plaid API 的 public_token

我试图从这里开始遵循 Plaid 的文档,但我似乎无法弄清楚public_token当我在 Plaid开发环境中工作时从哪里获得。他们是这样说的:

在他们的第二个例子中:

from plaid import Client


client = Client(client_id='***', secret='***', public_key='***', environment='sandbox')

# the public token is received from Plaid Link
response = client.Item.public_token.exchange(public_token)
access_token = response['access_token']
Run Code Online (Sandbox Code Playgroud)

我不知道从哪里来的public_token。如果我去那个格子链接他们说:

此存储库现已弃用。要与 Plaid 集成,请访问文档。https://plaid.com/docs

然后,当我去他们的官方文档时,我似乎找不到任何方法来获得它public token

我正在尝试按照以下方式做一些事情:

from exceptions import (
    InvalidPlaidEnvironment,
    MissingPlaidCredential
)

from plaid import Client
from plaid.errors import APIError, ItemError, InvalidRequestError


VALID_ENVIRONMENTS = (
    'sandbox',
    'development',
    'production'
)

CLIENT_ID = '<development_client_id>'
SECRET …
Run Code Online (Sandbox Code Playgroud)

python-3.x plaid

4
推荐指数
1
解决办法
1724
查看次数

为什么以下代码的行为如此奇怪?Python3.5和Python3.6

如标题所示,以下代码为什么表现得如此奇怪?

a = {
    0: 0
}
b = []

for i in a:
    del a[i]
    a[i + 1] = 0
    b.append(i)

print(b)
Run Code Online (Sandbox Code Playgroud)

在Python3.6中它会打印[0, 1, 2, 3, 4],而在Python3.5中它会打印[0, 1, 2, 3, 4, 5, 6, 7]。为什么?

python language-lawyer python-3.x

3
推荐指数
1
解决办法
103
查看次数