2014-05-14 124 views
3

我試圖從www.intellicast.comPython的網頁抓取表返回無

soup = BeautifulSoup(urllib2.urlopen('http://www.intellicast.com/Local/History.aspx?location=USTX0057').read()) 
for row in soup('table',{'id':'dailyClimate'})[0].tbody('tr'): 
    tds=row 
    print tds 

結果湊表的感溫元件: TypeErrorL「NoneType」對象不是可調用

當我看到頁面源代碼,我可以看到

<table id = "dailyClimate" class="Container"> 
    <tbody> 
    <tr class="TitlesAvgRecord"> 
     <td.. 
    <td>...</td> 

所以我知道有一個tbody以及tr元素。

如果我爲.tbody('td')更改.tbody('tr'),我仍然得到一個錯誤,所以我假設我假設這個錯誤是在調用tbody的地方。

回答

3

瀏覽器插入<tbody>元素,但實際源沒有這個元素:

<table id="dailyClimate" class="Container"> 
    <tr class="TitlesAvgRecord"> 
    <td style="padding-left:5px;">Date</td> 
    <td>Average<br />Low</td> 
    <td>Average<br />High</td> 
    <td>Record<br />Low</td> 
    <td>Record<br />High</td> 
    <td>Average<br />Precipitation</td> 
    <td>Average<br />Snow</td> 
    </tr> 

<!-- etc. --> 

Why do browsers insert tbody element into table elements?

您可以使用html5lib解析器,而不是(使用BeautifulSoup(source, 'html5lib')),其將插入元素。但是,你並不需要尋找它,只是直奔<tr>行:

for row in soup.find('table', id='dailyClimate').find_all('tr'): 

,或者使用CSS選擇器:

for row in soup.select('table#dailyClimate tr'): 

你通常只能選擇當tbody元素可能有不止一個,或者您想排除的theadtfooter元素。

+0

太棒了!我從來沒有猜到過。謝謝 – FMarquez