Python网页爬虫表格返回None
我正在尝试从 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
元素,或者你想排除某个 thead
或 tfooter
元素时,你才会选择 tbody
元素。