我希望从一个城市和许多城市中提取生活成本的变化。我计划在一个CSV文件中列出我想比较的城市,并使用这个列表来创建一个网络链接,将带我到该网站与我正在寻找的信息。在
下面是一个示例的链接:http://www.expatistan.com/cost-of-living/comparison/phoenix/new-york-city
不幸的是,我遇到了几个挑战。如果您能为以下挑战提供帮助,我们将不胜感激!在
当前CSV格式(注意:'if语句'无法正常工作):
City,Food,Housing,Clothes,Transportation,Personal Care,Entertainment
n,e,w,-,y,o,r,k,-,c,i,t,y,-,4,8,%
n,e,w,-,y,o,r,k,-,c,i,t,y,-,1,2,9,%
n,e,w,-,y,o,r,k,-,c,i,t,y,-,6,3,%
n,e,w,-,y,o,r,k,-,c,i,t,y,-,4,3,%
n,e,w,-,y,o,r,k,-,c,i,t,y,-,4,2,%
n,e,w,-,y,o,r,k,-,c,i,t,y,-,4,2,%
首选CSV格式:
^{pr2}$这是我当前的代码:
import requests
import csv
from bs4 import BeautifulSoup
#Read text file
Textfile = open("City.txt")
Textfilelist = Textfile.read()
Textfilelistsplit = Textfilelist.split("\n")
HomeCity = 'Phoenix'
i=0
while i<len(Textfilelistsplit):
url = "http://www.expatistan.com/cost-of-living/comparison/" + HomeCity + "/" + Textfilelistsplit[i]
page = requests.get(url).text
soup_expatistan = BeautifulSoup(page)
#Prepare CSV writer.
WriteResultsFile = csv.writer(open("Expatistan.csv","w"))
WriteResultsFile.writerow(["City","Food","Housing","Clothes","Transportation","Personal Care", "Entertainment"])
expatistan_table = soup_expatistan.find("table",class_="comparison")
expatistan_titles = expatistan_table.find_all("tr",class_="expandable")
for expatistan_title in expatistan_titles:
percent_difference = expatistan_title.find("th",class_="percent")
percent_difference_title = percent_difference.span['class']
if percent_difference_title == "expensiver":
WriteResultsFile.writerow(Textfilelistsplit[i] + '+' + percent_difference.span.string)
else:
WriteResultsFile.writerow(Textfilelistsplit[i] + '-' + percent_difference.span.string)
i+=1
csv.writer.writerow()
接受一个序列,并使每个元素成为一个列;通常,您将给它一个带有列的列表,但您将传递字符串;这将添加单个字符作为列。在只需构建一个列表,然后将其写入CSV文件。在
首先,打开CSV文件一次,而不是针对每个单独的城市;每次打开时,您都会清除该文件。在
答案:
问题1:
span
的类是一个列表,您需要检查expensiver
是否在该列表中。换言之,替换:有:
writerow()
,而不是字符串。而且,由于每个城市只需要一条记录,所以在循环外调用writerow()
(通过tr
s)。在其他问题:
csv
文件进行写入以下是修改后的代码:
对于只包含一个
new-york-city
行的City.txt
,它生成具有以下内容的Expatistan.csv
:你一定要明白我做了什么改变。如果你需要进一步的帮助,请告诉我。在
因此,首先,我们将一个iterable传递给
writerow
方法,然后该iterable中的每个对象都将被写为用逗号分隔它们。所以如果你给它一个字符串,那么每个字符就会被分开:写
^{pr2}$但是
写
这就是为什么你得到的结果
你剩下的问题都是你的网络错误。首先,当我浏览站点时,用CSS类“comparison”搜索表会得到
None
。所以我不得不用现在,你的“如果声明被破坏”是因为
返回一个列表。如果我们把它改成
百分比_差异.span['class'][0]
事情会按你期望的方式进行。在
现在,您真正的问题是在最里面的循环中,您会发现单个项目的价格变化百分比。您希望这些项目作为价格差异行中的项目,而不是单个行。因此,我声明一个空列表
items
,并将percent_difference.span.string
附加到该列表中,然后在最内层的循环外写入该行,如下所示:最后一个错误是,在
while
循环中,您重新打开csv文件,并覆盖所有内容,因此最后只有最后一个城市。对所有这些错误(其中许多错误您应该可以在没有帮助的情况下找到)留给我们的是:相关问题 更多 >
编程相关推荐