过度使用列表和字符串格式

时间:2014-05-01 17:24:35

标签: python-2.7 beautifulsoup

这很有效,但非常非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)。

1 个答案:

答案 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标记。

如果有帮助,请告诉我们。