如何在 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]
展平列表并获得您想要的结果。
我试图在多个网站的 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]
展平列表并获得您想要的结果。