gpt4 book ai didi

Python 嵌套循环仅适用于第一遍

转载 作者:太空宇宙 更新时间:2023-11-03 14:14:27 25 4
gpt4 key购买 nike

目标:编写一个屏幕抓取程序来检查网页以查看它们是否包含某些内容。

方法:有两个配置文件,一个包含 URL 列表,另一个包含要搜索的字符串列表。打开这两个文件并将其内容作为两个数组读入。

循环遍历 URL 数组(我们称之为循环 A)。

对于每个 URL,使用 urllib 读取页面并通过在\n 上拆分将其拆分为一个数组。循环遍历字符串列表(循环 B)。

对于字符串中的每一行,循环遍历 HTML 行(循环 C),并在每一行上进行模式匹配。如果找到匹配项,将结果记录在输出文件中。

问题:它可以正常打开配置文件。循环 A 工作正常。循环 B 和循环 C 仅在循环 A 的第一次通过时起作用。在循环 A 的第二次和第三次通过时,循环 B 没有发生。

原谅我放了那么多调试代码。一个奇怪的怪癖是,我在代码的第 52 行生成的输出中看到一个神秘的“b”。

配置文件内容:

网址.txt

http://uk.norton.com
http://us.norton.com
http://ie.norton.com

目标字符串.txt

Norton Online Backup
Norton Ultimate Help Desk

代码:

# Import the modules we need
import urllib.request
import re

# Open the files we need
out = open('out.txt', 'w')
urls=open('urls.txt','r')
targetFile=open('targetStrings.txt','r',encoding=('utf-8'))

# function to take a URL, open the HTML, split it into an array, and return it
def getPage(url):
return urllib.request.urlopen(url).read().decode().split('\n')

# function to kick out to an output file
def outFile(output):
out.write(output + '\n')

# Function to test for matches
def match(string, pageLine):
if re.search(string.encode('utf-8'),pageLine):
return True
else:
return False


#Loop through the URLs - Loop A
for url in urls:
url=url.rstrip('\n')
outFile('\nOpening ' + url)
# response=urllib.request.urlopen(url)
# html=response.read().decode()
html=getPage(str(url))
if html !='':
outFile('Page read successfully')
else:
outFile('Problem reading page')

outFile(url + ' has ' + str(len(html)) + ' lines')

#Loop through targetStrings - Loop B. This is only happening on the first pass of loop A.
for line in targetFile:
outFile('Beginning \'for line in targetFile:\' loop')
line=line.rstrip('\n') #take out any \n newline characters at the end
outFile('Looking for ' + line + ' in ' + url)
foundCount=0

# Loop through current HTML file - Loop C
pageLineNumber=0
for pageLine in html:
pageLineNumber+=1
pageLine=pageLine.encode('utf-8')
outFile('Looking for ' + str(line) + ' in ' + str(pageLineNumber) + ' ' + str(pageLine))
if match(line, pageLine):
foundCount+=1
outFile('FoundCount is ' + str(foundCount))
outFile('Searched ' + str(pageLineNumber) + ' lines')

if foundCount==0:
outFile('Did not find ' + str(line))
else:
s=''
if foundCount>0:
s='s'
outFile('Found ' + line + ' ' + str(foundCount) + ' time' + s)
foundCount=0
f.close()
urls.close()
targetFile.close()

最佳答案

问题不在您的嵌套 for 循环中。在 for line in targetFile: 中,您在外循环的每次迭代中读取“targetFile”。您不能多次读取文件对象,因为一次完全读取,读取指针设置为文件末尾。您需要创建一个新的文件对象或使用 file_obj.seek(0) 将读取指针再次移动到文件的开头。因此,您可以在 for line in targetFile: 循环之后添加 targetFile.seek(0) 作为外循环的最后一行。

for url in urls:
# outer loop code
for line in targetFile:
# inner loop code
targetFile.seek(0)

f.close()
urls.close()
targetFile.close()

@pvg 建议的其他更好的选择是读取列表中的所有行

targetLines=open('targetStrings.txt','r',encoding=('utf-8')).readlines()

然后使用该列表

for line in targetLines:

因为这比一遍又一遍地读取文件更有效率。

关于Python 嵌套循环仅适用于第一遍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34553559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com