2017-10-17 413 views
0

我在一个函数中创建了一个小型web爬虫,upso_finalpython print()不输出我期望的内容

如果我print(upso_final()),我得到15个名单,包括标题,地址,电话号码。不过,我只想打印出标题,所以我使用变量标题为全局字符串。当我打印它时,我只能得到1个标题,这是最后一个标题。我想获得全部15个冠军。

from __future__ import unicode_literals 

import requests 
from scrapy.selector import Selector 
import scrapy 
import pymysql 

def upso_final(page=1): 
    def upso_from_page(url): 
     html = fetch_page(url) 
     sel = Selector(text=html) 

     global title,address,phone 
     title = sel.css('h1::text').extract() 
     address = sel.css('address::text').extract() 
     phone = sel.css('.mt1::text').extract() 
     return { 
      'title' : title, 
      'address' : address, 
      'phone' : phone 
     } 
    def upso_list_from_listpage(url): 
     html = fetch_page(url) 
     sel = Selector(text=html) 
     upso_list = sel.css('.title_list::attr(href)').extract() 

     return upso_list 
    def fetch_page(url): 
     r = requests.get(url) 
     return r.text  

    list_url = "http://yp.koreadaily.com/list/list.asp?page={0}&bra_code=LA&cat_code=L020502&strChar=&searchField=&txtAddr=&txtState=&txtZip=&txtSearch=&sort=N".format(page) 
    upso_lists = upso_list_from_listpage(list_url) 
    upsos = [upso_from_page(url) for url in upso_lists] 
    return upsos 

upso_final() 

print (title,address,phone) 
+1

既然你只有一个'print',它不是在一个循环中,你只会得到一行输出。你的逻辑需要一些工作。 –

+0

当你到一个分辨率,请记得赞成票有用的东西,并接受你最喜欢的答案(即使你必须把它写自己),所以堆栈溢出可以正常存档的问题。 – Prune

回答

0

基本问题是你对从函数传回值感到困惑。

upso_from_page找到15个记录中的每一个,将所需的信息放入全局变量(通常是一个糟糕的设计)。但是,只有在找到所有结果后才打印任何结果。由于您的逻辑将每个记录覆盖前一个记录,因此只打印找到的最后一个记录。

看来,upso_final积累列表并返回它,但你忽略该返回值。相反,试试这个在您的主程序:

upso_list = upso_final() 

for upso in upso.list: 
    print (upso) 

这应该给你提供3项字典每个upso记录;从那里,你可以了解你的口味的参考和格式。


一个替代的解决方案是打印每个记录,你找到它,从upso_from_page内,但整体的设计表明这不是你想要的。

+0

哦...非常感谢。我现在明白了, – hoseongki