我试图从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
结果: TypeErrorL' NoneType'对象不可调用
查看页面源代码时,我可以看到
<table id = "dailyClimate" class="Container">
<tbody>
<tr class="TitlesAvgRecord">
<td..
<td>...</td>
所以我知道有一个tbody和一个tr元素。
如果我为.tbody更改了.tbody(&#39; tr&#39;),我仍然会收到错误,所以我假设我假设错误是在调用tbody的某个地方。
答案 0 :(得分: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
元素(如果可能有多个元素),或者您想要排除thead
或tfooter
元素。