编程语言
首页 > 编程语言> > Python Web Scraping表返回None

Python Web Scraping表返回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

结果:
TypeErrorL’NoneType’对象不可调用

当查看页面源代码时,我可以看到

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

因此,我知道有一个tbody和一个tr元素.

如果将.tbody(‘td’)的.tbody(‘tr’)更改,我仍然会收到错误,因此我假设我假设错误是在调用tbody的某个地方.

解决方法:

您的浏览器会插入< 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'):

通常,只有在可能有多个元素或者要排除的thead或tfooter元素时,才选择tbody元素.

标签:html-table,beautifulsoup,web-scraping,python
来源: https://codeday.me/bug/20191121/2054039.html