<p>答案:</p>
<ul>
<li><p>问题1:<code>span</code>的类是一个列表,您需要检查<code>expensiver</code>是否在该列表中。换言之,替换:</p>
<pre><code>if percent_difference_title == "expensiver"
</code></pre>
<p>有:</p>
<pre><code>if "expensiver" in percent_difference.span['class']
</code></pre></li>
<li>问题2和3:您需要将列值的列表传递给<code>writerow()</code>,而不是字符串。而且,由于每个城市只需要一条记录,所以在循环外调用<code>writerow()</code>(通过<code>tr</code>s)。在</li>
</ul>
<p>其他问题:</p>
<ul>
<li>在循环之前打开<code>csv</code>文件进行写入</li>
<li>在处理文件时使用<a href="https://docs.python.org/2/reference/compound_stmts.html#the-with-statement" rel="nofollow">^{<cd7>}</a>上下文管理器</li>
<li>尝试遵循<a href="http://legacy.python.org/dev/peps/pep-0008/" rel="nofollow">^{<cd8>}</a>风格指南</li>
</ul>
<p>以下是修改后的代码:</p>
<pre><code>import requests
import csv
from bs4 import BeautifulSoup
BASE_URL = 'http://www.expatistan.com/cost-of-living/comparison/{home_city}/{city}'
home_city = 'Phoenix'
with open('City.txt') as input_file:
with open("Expatistan.csv", "w") as output_file:
writer = csv.writer(output_file)
writer.writerow(["City", "Food", "Housing", "Clothes", "Transportation", "Personal Care", "Entertainment"])
for line in input_file:
city = line.strip()
url = BASE_URL.format(home_city=home_city, city=city)
soup = BeautifulSoup(requests.get(url).text)
table = soup.find("table", class_="comparison")
differences = []
for title in table.find_all("tr", class_="expandable"):
percent_difference = title.find("th", class_="percent")
if "expensiver" in percent_difference.span['class']:
differences.append('+' + percent_difference.span.string)
else:
differences.append('-' + percent_difference.span.string)
writer.writerow([city] + differences)
</code></pre>
<p>对于只包含一个<code>new-york-city</code>行的<code>City.txt</code>,它生成具有以下内容的<code>Expatistan.csv</code>:</p>
<pre><code>City,Food,Housing,Clothes,Transportation,Personal Care,Entertainment
new-york-city,+48%,+129%,+63%,+43%,+42%,+42%
</code></pre>
<p>你一定要明白我做了什么改变。如果你需要进一步的帮助,请告诉我。在</p>