2017-05-24 51 views
0

我已经写了一些代码,以针对某些商店名称刮取“地址”和“电话”,这些商店名称工作正常。但是,它有两个参数来执行它的活动。我希望从csv文件中做同样的事情,其中​​“名称”将在第一列,“盖”将在第二列,收获的结果将相应地放在第三和第四列。在这一点上,我不知道如何从csv文件执行搜索。任何建议将非常感激。无法从csv文件执行反向网页搜索

import requests 
from lxml import html 

Names=["Literati Cafe","Standard Insurance Co","Suehiro Cafe"] 
Lids=["3221083","497670909","12183177"] 
for Name in Names and Lids: 
    Page_link="https://www.yellowpages.com/los-angeles-ca/mip/"+Name.replace(" ","-")+"-"+Name 
    response = requests.get(Page_link) 
    tree = html.fromstring(response.text) 
    titles = tree.xpath('//article[contains(@class,"business-card")]') 
    for title in titles: 
     Address= title.xpath('.//p[@class="address"]/span/text()')[0] 
     Contact = title.xpath('.//p[@class="phone"]/text()')[0] 
     print(Address,Contact) 

回答

1

您可以从CSV让您NamesLids列表,如:

import csv 

Names, Lids = [], [] 
with open("file_name.csv", "r") as f: 
    reader = csv.DictReader(f) 
    for line in reader: 
     Names.append(line["Name"]) 
     Lids.append(line["Lid"]) 

(PEP没关系侵犯现在;))。然后,您可以在代码的其余部分使用它,尽管我不确定您的for Name in Names and Lids:循环试图达到什么目的,但它不会让您认为它是什么 - 它不会循环访问列表,但只能通过列表中的Lids

而且优化的第一顺序应该是与环比CSV取代你的循环,如:

with open("file_name.csv", "r") as f: 
    reader = csv.DictReader(f) 
    for entry in reader: 
     page_link = "https://www.yellowpages.com/los-angeles-ca/mip/{}-{}".format(entry["Name"].replace(" ","-"), entry["Lid"]) 
     # rest of your scraping code... 
+0

感谢zwer,你的答案。我刚才测试了你的代码,它的功能很神奇。你让我贪心。关于这个的最后一个问题。我如何将填充结果写入相应的列。我与csv一起工作,但都属于初级。谢谢万亿。 – SIM

+1

你可以使用'csv.writer()'。尽管在技术上可行,但在读取文件时更新文件可能会导致受到伤害的世界,因此要么使用第一个示例来加载您的“Names”和“Leads”列表,然后在循环播放时重新写入CSV ,或创建临时CSV文件,向其中写入更新的内容,然后在完成循环后重写原始文件。有很多示例如何处理CSV阅读和写作:https://docs.python.org/3/library/csv.html – zwer

+0

感谢您的一切。你节省了我数月的努力。 TC。 – SIM