我有一个存储在变量href
中的网址列表。当我通过下面的函数传递它时,唯一返回的recipe_links来自href
中的第一个URL。我的代码有任何明显的错误吗?我不确定为什么它不会遍历href
中存储的所有20个网址。我按照预期检索了href
中第一个网址的返回结果,但我无法将循环转到下一个网址。
def first_page_links(link):
recipe_links = []
recipe_html = []
for x in link:
page_request = requests.get(x)
recipe_html.append(html.fromstring(page_request.text))
print recipe_html
for x in recipe_html:
recipe_links.append(x.xpath('//*[@id="content"]/ul/li/a/@href'))
return recipe_links
答案 0 :(得分:4)
观看放置return
的位置。您可能希望在完成所有循环后返回:
def first_page_links(link):
recipe_links = []
recipe_html = []
for x in link:
page_request = requests.get(x)
recipe_html.append(html.fromstring(page_request.text))
print recipe_html
for x in recipe_html:
recipe_links.append(x.xpath('//*[@id="content"]/ul/li/a/@href'))
return recipe_links
答案 1 :(得分:2)
尝试推出第二个循环和return
行,这样就不会发生冗余迭代,并且正确返回最终列表,如下所示:
from lxml import html
import requests as rq
def first_page_links(links):
recipe_links = []
recipe_html = []
for link in links:
r = rq.get(link)
recipe_html.append(html.fromstring(r.text))
for rhtml in recipe_html:
recipe_links.append(rhtml.xpath('//*[@id="content"]/ul/li/a/@href'))
return recipe_links
如果有效,请告诉我们。
修改强>
请考虑以下事项:
y_list = []
final_list = []
for x in x_list:
y_list.append(x)
for y in y_list:
final_list.append(y)
这是你的功能,简化了。假设在x_list
中有3个网址,会发生以下情况:
x1
附加到y_list
。y_list
仅使用x1
进行处理,因此仅x1
附加到final_list
。 final_list
现在包含:[x1]
x2
附加到y_list
。y_list
现在包含x1
和x2
。 两者 都会被处理并附加到final_list
。 final_list
现在包含:[x1, x1, x2]
。x3
附加到y_list
。 y_list
现在包含x1
,x2
和x3
。由于第二个循环(处理第一个列表中的项目)位于第一个循环内,后者将增量添加到第一个列表,第二个循环将处理第一个列表 on第一个循环的每次迭代。这使它成为冗余迭代。
有许多方法可以执行您想要执行的操作,但如果您只是附加到列表并且需要在两者上都进行一次循环,那么上述修复就是所需要的。