Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仅收集第一页内容的刮板_Python_Python 3.x_Web Scraping_Return - Fatal编程技术网

Python 仅收集第一页内容的刮板

Python 仅收集第一页内容的刮板,python,python-3.x,web-scraping,return,Python,Python 3.x,Web Scraping,Return,我已经使用python编写了一个刮刀,从yiffy torrents中刮取电影名称。该网页已浏览了约12页。如果我使用print语句运行爬虫程序,它会给出所有页面的所有结果。但是,当我使用return运行相同的程序时,它只会给出第一页的内容,而不会继续到下一页来处理其余的内容。由于我很难理解返回语句的行为,如果有人指出我哪里出了问题,并给我一个解决办法,我会非常高兴。提前谢谢 这就是我正在尝试的(完整代码): 但是,当我喜欢下面的内容时,我会得到所有结果(仅粘贴要点部分): 您的film\u存储

我已经使用python编写了一个刮刀,从yiffy torrents中刮取电影名称。该网页已浏览了约12页。如果我使用
print
语句运行爬虫程序,它会给出所有页面的所有结果。但是,当我使用
return
运行相同的程序时,它只会给出第一页的内容,而不会继续到下一页来处理其余的内容。由于我很难理解返回语句的行为,如果有人指出我哪里出了问题,并给我一个解决办法,我会非常高兴。提前谢谢

这就是我正在尝试的(完整代码):

但是,当我喜欢下面的内容时,我会得到所有结果(仅粘贴要点部分):


您的
film\u存储
结果列表是函数
get\u links()
的本地结果列表,该函数在下一页递归调用。递归调用之后(对于接下来的所有页面),initial(entry)函数只返回第一页的结果

您必须(1)将尾部递归展开为循环,(2)使结果列表全局化;(3) 使用回调(如调用
print
),或者最好的选择(4)是
get\u links
函数转换为生成器,生成所有页面的结果

生成器版本:

def get_links(link):
    root = fromstring(requests.get(link).text)
    for item in root.cssselect(".mv"):
        name = item.cssselect("h3 a")[0].text
        yield name

    next_page = root.cssselect(".pager a:contains('Next')")[0].attrib['href'] if root.cssselect(".pager a:contains('Next')") else ""
    if next_page:
        full_link = urljoin(link,next_page)
        for name in get_links(full_link):
            yield name

return语句过早地终止了get_links()函数。意思是这一部分

next_page = root.cssselect(".pager a:contains('Next')")[0].attrib['href'] if root.cssselect(".pager a:contains('Next')") else ""
    if next_page:
        full_link = urljoin(link,next_page)
        get_links(full_link)
永远不会被执行

快速修复方法是将return语句放在函数的末尾,但必须使film_存储全局化(在get_links()函数之外定义)

编辑: 刚刚意识到,由于您将使您的胶片存储全球化,因此不需要返回声明

主要代码如下所示:

get_links(main_link)
for item in film_storage:
    print(item)

这似乎是有希望的。尝试一下,让你知道。谢谢。顺便说一句,这只是一个快速解决方案,因为你提到你刚刚开始你的刮擦之旅。但我建议您以后尝试@randomir的解决方案/建议。这样,您可以制作更好、更高效的刮刀。抱歉,刚刚意识到,由于film_存储是全局的,因此不需要返回语句。您的解决方案工作得非常完美。基本上,我在这里粘贴的是完整代码的一小部分,应该由类重用。再次感谢。你为主要声明建议的部分也起作用了。顺便说一句,我在主要陈述下写这部分的方式有什么问题?请注意回复。谢谢,谢谢你的意见+1。不客气,但请注意,您应该尽量避免使用全局变量。它们使您的代码可读性降低,程序的不同部分以意外的方式耦合,并且总体上您的程序更容易出错。
next_page = root.cssselect(".pager a:contains('Next')")[0].attrib['href'] if root.cssselect(".pager a:contains('Next')") else ""
    if next_page:
        full_link = urljoin(link,next_page)
        get_links(full_link)
get_links(main_link)
for item in film_storage:
    print(item)