2017-10-17 415 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