如何在 python 中对多个列表使用 lower()?

How to use lower() with multiple lists in python?

我试图在多个网站的 html 源代码中查找某些关键字。我希望我的爬虫能够找到这些关键字,无论它们在网站的 html 源代码中是大写还是小写。为了完成这项工作,我尝试在此脚本中使用 .lower() 查询:

from selenium import webdriver
import csv

def keywords():
    with open('urls.csv') as csv_file:
        csv_reader = csv.reader(csv_file)

        driver = webdriver.Chrome(executable_path=r'C:\Users\Peter\PycharmProjects\Testing\chromedriver_win32\chromedriver.exe')

        list_1 = ['keyword 1', 'keyword 2', 'keyword 3']
        list_2 = ['keyword 4', 'keyword 5', 'keyword 6']
        list_3 = ['keyword 7', 'keyword 8']

        keywords = [list_1, list_2, list_3]

        for row in csv_reader:
            driver.get(row[0])
            html = driver.page_source

            for searchstring in keywords:
                if searchstring.lower() in html.lower():
                    print (row[0], searchstring, 'found')

                else:
                    print (row[0], searchstring, 'not found')

print keywords()

错误:

AttributeError: 'list' object has no attribute 'lower'

所以我发现 .lower() 不适用于列表,只适用于字符串。

我用谷歌搜索了错误和我的问题,但没有找到解决问题的方法。有什么建议可以用我当前的脚本解决这个问题吗?

您可以将关键字作为字符串列表中的字符串列表。 这里我已经降低关键词了

from selenium import webdriver
import csv

def keywords():
    with open('urls.csv') as csv_file:
        csv_reader = csv.reader(csv_file)

        driver = webdriver.Chrome(executable_path=r'C:\Users\Peter\PycharmProjects\Testing\chromedriver_win32\chromedriver.exe')

        list_1 = ['keyword 1', 'keyword 2', 'keyword 3']
        list_2 = ['keyword 4', 'keyword 5', 'keyword 6']
        list_3 = ['keyword 7', 'keyword 8']

        lower_list = lambda x: x.lower()
        keywords = map(lower_list, list_1 + list_2 + list_3)

        for row in csv_reader:
            driver.get(row[0])
            html = driver.page_source

你可以使用map函数,像这样

l = ['Item 1', 'ITEM 2', 'ITEM 3', 'ItEM 4']
m = map(str.lower, l)
print(list(m))

这让你 ['item 1', 'item 2', 'item 3', 'item 4']

map 将一个函数应用于可迭代对象的每个元素,returns 一个 map 对象,它本身就是一个可迭代对象。您可以在 for searchstring in map(str.lower, keywords)

中执行 map(str.lower, keywords)

编辑:糟糕,没有注意到您想要以这种方式组合三个列表。您可以使用 [item.lower() for sublist in keywords for item in sublist] 展平列表并获得您想要的结果。