Python,Selenium:从返回的列表中隔离项

Python,Selenium:从返回的列表中隔离项,python,python-3.x,list,selenium,dictionary,Python,Python 3.x,List,Selenium,Dictionary,通过阅读、视频和社区的帮助,我能够从Selenium和Python中获取数据 这个网站需要一个联合国和PW。我已经在下面的代码中包含了这个,这是非必要的凭证,专门用来提问 我的最终目标是循环浏览零件号的Excel列表,并搜索一组参数,包括价格。在引入一个循环列表之前,我希望将所需的信息与所刮取的内容隔离开来 我不确定如何过滤这些信息 代码如下: 导入时间 #需要Selenium与web元素交互 从selenium导入webdriver 从selenium.webdriver.support将预期

通过阅读、视频和社区的帮助,我能够从Selenium和Python中获取数据

这个网站需要一个联合国和PW。我已经在下面的代码中包含了这个,这是非必要的凭证,专门用来提问

我的最终目标是循环浏览零件号的Excel列表,并搜索一组参数,包括价格。在引入一个循环列表之前,我希望将所需的信息与所刮取的内容隔离开来

我不确定如何过滤这些信息

代码如下:

导入时间
#需要Selenium与web元素交互
从selenium导入webdriver
从selenium.webdriver.support将预期的_条件导入为EC
#需要numpy/pandas与大型数据集交互
将numpy作为np导入
作为pd进口熊猫
chrome\u path=r“C:\Users\James\Documents\Python Scripts\jupyterNoteBooks\ScrapingData\chromedriver\u win32\chromedriver.exe”
driver=webdriver.Chrome(Chrome\u路径)
驱动程序。获取(“https://www.tessco.com/login")
userName=“FirstName。SurName321123@gmail.com"
password=“PasswordForThis123”
#设置等待,等待元素加载到DOM中
wait10=WebDriverWait(驱动程序,10)
wait20=WebDriverWait(驱动程序,20)
wait30=WebDriverWait(驱动程序,30)
elem=wait10.until(EC.element可点击((By.ID,“userID”))
元素发送密钥(用户名)
elem=wait10.until(EC.element可点击((By.ID,“密码”))
要素发送密钥(密码)
#按登录按钮
驱动程序。通过xpath(“html/body/account login/div/div[1]/form/div[6]/div/button”)查找元素。单击()
#展开搜索栏
searchIcon=wait10.until(EC.element可点击((By.XPATH,“/html/body/header/div[2]/div/div/ul/li[2]/i”))
搜索图标。单击()
searchBar=wait10.until(EC.element可点击((By.XPATH,'/html/body/header/div[3]/input'))
搜索栏。单击()
#通过Excel文件从组件集合加载制造零件号
#在搜索栏中输入信息
搜索栏。发送密钥(“HL4RPV-50”+“\n”)
#等待加载产品信息
products=wait30.until(EC.presence\u所有元素的位置((By.XPATH,//div[@class='CoveoResult']))
#创建一个字典来存储产品和价格
productInfo={}
#迭代搜索结果中的所有产品,并将详细信息添加到字典中
对于产品中的产品:
#获取产品信息,如OEM、说明和零件号
productDescr=product.find_element_by_xpath(“.//a[@class='productName CoveoResultLink HIDDED xs'])。text
mfgPart=product.find_element_by_xpath(“.//ul[@class='unlistedinfo']”)。text.split('\n')[3]
mfgName=产品。通过标签名称(“img”)查找元素。获取属性(“alt”)
#获得价格
price=product.find_element_by_xpath(“.//div[@class='price']”)。text.split('\n')[1]
#向字典添加详细信息
productInfo[mfgPart、mfgName、productDescr]=价格
#打印产品信息
打印(产品信息)
输出是

{('MFG PART #: HL4RPV-50', 'CommScope', '1/2" Plenum Air Cable, Off White'): '$1.89', ('MFG PART #: HL4RPV-50B', 'CommScope', '1/2" Plenum Air Cable, Blue'): '$1.89', ('MFG PART #: L4HM-D', 'CommScope', '4.3-10 Male for 1/2" AL4RPV-50,LDF4-50A,HL4RPV-50'): '$19.94', ('MFG PART #: L4HR-D', 'CommScope', '4.3-10M RA for 1/2" AL4RPV-50, LDF4-50A, HL4RPV-50'): '$39.26', ('MFG PART #: UPL-4MT-12', 'JMA Wireless', '4.3-10 Male Connector for 1/2” Plenum Cables'): '$32.99', ('MFG PART #: UPL-4F-12', 'JMA Wireless', '4.3-10 Female Connector for 1/2" Plenum'): '$33.33', ('MFG PART #: UPL-4RT-12', 'JMA Wireless', '4.3-10 R/A Male Connector for 1/2" Plenum'): '$42.82', ('MFG PART #: L4HF-D', 'CommScope', '4.3-10 Female for 1/2 in AL4RPV-50, LDF4-50A'): '$20.30'}
我只想要在自动搜索中引用的内容,因此对于这个示例,我将寻找

(“制造零件”:HL4RPV-50”、“康普”、“1/2”增压空气电缆,灰白色”):“$1.89”

最后,我计划用项目列表替换HL4RPV-50标签,但现在,我相信我应该过滤所需的内容

我怀疑逻辑是否正确,但我已尝试打印出与搜索要求相同的任何零件的产品信息,如下所示

for item in mfgPart:
    if mfgPart == "HL4RPV-50":
        print(productInfo)
但是上面的代码只是像以前一样打印了所有输出

然后,我尝试导入
itertools
,并运行以下操作:

print(dict(itertools.islice(productInfo.items(), 1)))
它实际上返回了我想要的行项目,但不能保证第一个返回的项目就是我正在寻找的。如果我能根据给定的零件号过滤掉精确的搜索,那将是最好的

有什么方法可以根据输入过滤结果吗


非常感谢您的任何提示。

您可以将此筛选代码用于Python字典

 searchedProduct = dict(filter(lambda item: "HL4RPV-50" in item[0], productInfo.items()))
 print(searchedProduct)

您的原始示例非常接近,我们只需循环检查每个项目,并使用字典关键部分中的列表。如果您不介意嵌套,这将完成以下操作:)您只需要适当调整关键字

注意:

def main():

""" Get our key from our dictionary """
for key in productinfo.items():

    """ Retrieve our list of strings """
    for stringList in key[0]:

        """ For every new line in our list of strings """
        for newline in stringList.splitlines():

            """ Lets split by each word in our line """
            for string in newline.split(' '):

                """ Check each string against our keyword """
                if string == "HL4RPV-50B":
                    print(key)

if __name__ == '__main__':
    main()
如果使用Python2.X,则可能必须使用
productinfo.iteritems()
,在本例中假设为3.X

示例:

def main():

""" Get our key from our dictionary """
for key in productinfo.items():

    """ Retrieve our list of strings """
    for stringList in key[0]:

        """ For every new line in our list of strings """
        for newline in stringList.splitlines():

            """ Lets split by each word in our line """
            for string in newline.split(' '):

                """ Check each string against our keyword """
                if string == "HL4RPV-50B":
                    print(key)

if __name__ == '__main__':
    main()

其他答案似乎在检查零件号是否在mfg零件字符串中,但我发现有些项目可能包含相同的零件号,例如
HL4RPV-50
HL4RPV-50B
。如果您想隔离零件号,以便能够确切地知道您正在查看的零件,我建议您遍历字典,并在冒号处拆分mfg部件字符串以获取ID。您还可以抓取项目的其他部分以更清晰地打印信息,如下面的示例所示

对于(制造零件、通信范围、名称),productInfo.items()中的价格:
制造标识=制造零件分割(':')[1]
如果制造商id='HL4RPV-50':
打印(‘零件号:’,制造商id)
打印(“公司:”,通信范围)
打印('名称:',名称)
打印('价格:',价格)

是的,我正在使用Python3。很抱歉没有澄清!我看到了您在那里做的事情,它看起来很整洁;虽然上面的代码没有返回任何内容,而且我知道字符串HL4RP-50存在。此外,还有第二个列表项名为HL4RPV-50B,该项不是带有“B”吗“还返回值吗?谢谢David!调用索引为零会修复输出,尽管它会打印出包含该字符串的其他行项目。我是