python print()不输出我的期望

时间:2017-10-17 22:23:06

标签: python web-scraping web-crawler

我在一个函数 upso_final 中创建了一个小型网络爬虫程序。

如果我print(upso_final()),我会收到15个包含标题,地址,电话号码的列表。但是,我想打印出标题,所以我将变量 title 设为全局字符串。当我打印它时,我只获得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 个答案:

答案 0 :(得分:0)

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

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

似乎 upso_final 会累积列表并将其返回,但您忽略该返回值。相反,请在主程序中尝试:

upso_list = upso_final()

for upso in upso.list:
    print (upso)

这应该为每个 upso 记录提供一个3项词典;从那里,您可以根据自己的喜好学习参考和格式。

另一种解决方案是在 upso_from_page 中打印每条记录,但您的整体设计表明这不是您想要的。