这很有效,但非常非Pythonic。我确信我过度使用字符串格式和列表。 BeautifulSoup可以原生吗?
from bs4 import BeautifulSoup
xmlurl = "http://forecast.weather.gov/MapClick.php?lat=33.37110&lon=-104.529&unit=0&lg=english&FcstType=dwml"
def get_forecast():
soup = BeautifulSoup(urllib2.urlopen(xmlurl))
temps = soup.find_all("temperature")
maxtemps = str(temps[0])
maxlist = maxtemps.split('\n')
maxvalue= str(maxlist[2]).lstrip()
maxvalue = maxvalue.replace('<value>','')
maxvalue = maxvalue.replace('</value>','')
mintemps = str(temps[1])
minlist = mintemps.split('\n')
minvalue= str(minlist[2]).lstrip()
minvalue = minvalue.replace('<value>','')
minvalue = minvalue.replace('</value>','')
print maxvalue
print minvalue
if __name__ == '__main__':
get_forecast()
temps以可列表的形式返回:
[<temperature time-layout="k-p24h-n7-1" type="maximum" units="Fahrenheit">
<name>Daily Maximum Temperature</name>
<value>65</value>
<value>75</value>
<value>88</value>
<value>92</value>
<value>92</value>
<value>89</value>
<value>83</value>
</temperature>, <temperature time-layout="k-p24h-n6-2" type="minimum" units="Fahrenheit">
<name>Daily Minimum Temperature</name>
<value>38</value>
<value>47</value>
<value>53</value>
<value>55</value>
<value>56</value>
<value>56</value>
</temperature>, <temperature time-layout="k-p1h-n1-1" type="apparent" units="Fahrenheit"> <value>53</value> </temperature>]
然后我继续操纵它(很糟糕),直到我把它击败为提交......
我已经阅读了很多关于Python和BeautifulSoup的文档,我看不出来。我确信BS4可能会这样做,但我没有足够的格式来使语法正确。
我想要的是第一个每日最高温度(65)和第一个最低温度(38)。
答案 0 :(得分:0)
我相信你 过度思考 你的方法,而不是过度使用。请参阅以下代码:
<强>代码:强>
from bs4 import BeautifulSoup as bsoup
xml = """[<temperature time-layout="k-p24h-n7-1" type="maximum" units="Fahrenheit">
<name>Daily Maximum Temperature</name>
<value>65</value>
<value>75</value>
<value>88</value>
<value>92</value>
<value>92</value>
<value>89</value>
<value>83</value>
</temperature>, <temperature time-layout="k-p24h-n6-2" type="minimum" units="Fahrenheit">
<name>Daily Minimum Temperature</name>
<value>38</value>
<value>47</value>
<value>53</value>
<value>55</value>
<value>56</value>
<value>56</value>
</temperature>, <temperature time-layout="k-p1h-n1-1" type="apparent" units="Fahrenheit"> <value>53</value> </temperature>]"""
soup = bsoup(xml)
temps = soup.find_all("temperature")
max_temp = temps[0].find_all("value")[0].get_text()
print "Max temp: ", max_temp
min_temp = temps[1].find_all("value")[0].get_text()
print "Min temp: ", min_temp
<强>结果:强>
Max temp: 65
Min temp: 38
[Finished in 0.6s]
你说你只想要第一个最低温度和最高温度,对吧?我们这样做的方法是先制作汤。接下来,我们在汤中搜索temperature
标签。我们找到两个,一个用于最大值,一个用于最小值。
第三步 - 找到每个第一步 - 是相同的。首先,我们使用temperature
获取第一个temps[0]
标记。然后,我们找到具有value
标记的所有元素。第一个元素由[0]
索引返回。 get_text()
只是获取元素的内部文本。要获得第一个最低温度,我们只需将temps[0]
更改为temps[1]
,以便我们可以访问第二个temperature
标记。
如果有帮助,请告诉我们。