Python网页爬虫表格返回None

3 投票
1 回答
1753 浏览
提问于 2025-04-18 06:35

我正在尝试从 www.intellicast.com 网站上抓取一个表格中的温度数据。

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

结果是:TypeError: 'NoneType' 对象不可调用。

在查看页面的源代码时,我发现了

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

所以我知道页面中有一个 tbody 和一个 tr 元素。

如果我把 .tbody('tr') 改成 .tbody('td'),我仍然会遇到错误,所以我猜测这个错误可能是在调用 tbody 的时候出现的。

1 个回答

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. -->

你可以查看这个链接了解更多:为什么浏览器会在表格元素中插入 tbody 元素?

你也可以使用 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 元素时,你才会选择 tbody 元素。

撰写回答