BeautifulSoup find所有变量类型问题

时间:2017-07-19 16:40:24

标签: html python-3.x beautifulsoup

我试图使用python的BeautifulSoup从某些HTML中提取一些信息。

HTML的缩写:

<div class="ui-grid-canvas">
                            <!-- -->
                            <div class="ui-grid-row" ng-class="{'ui-grid-tree-header-row': row.treeLevel &gt; -1, 'ui-grid-row-dirty': row.isDirty, 'ui-grid-row-saving': row.isSaving, 'ui-grid-row-error': row.isError,'ui-grid-row-selected': row.isSelected}" ng-repeat="(rowRenderIndex, row) in rowContainer.renderedRows track by $index" ng-style="Viewport.rowStyle(rowRenderIndex)">
                                <div role="row" row-render-index="rowRenderIndex" ui-grid-row="row">
                                    <div role="row">
                                        <!-- -->
                                        <div class="ui-grid-cell ui-grid-coluiGrid-0005" ng-class="{sorted: col.name==$parent.$parent.$parent.$parent.$parent.$parent.$parent.datatableImpl.sortedColumn}" ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.uid" role="gridcell" tabindex="0" ui-grid-cell="">
                                            <div class="ui-grid-cell-contents" ng-bind-html="row.entity[col.field].content" title="Alnwick-Haldimand">Alnwick-Haldimand</div>
                                        </div>
                                        <!-- -->
                                        <div class="ui-grid-cell ui-grid-coluiGrid-0006" ng-class="{sorted: col.name==$parent.$parent.$parent.$parent.$parent.$parent.$parent.datatableImpl.sortedColumn}" ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.uid" role="gridcell" tabindex="0" ui-grid-cell="">
                                            <div class="ui-grid-cell-contents" ng-bind-html="row.entity[col.field].content" title="Alderville Community Centre">Alderville Community Centre</div>
                                        </div>
                                        <!-- -->
                                        <div class="ui-grid-cell ui-grid-coluiGrid-0007" ng-class="{sorted: col.name==$parent.$parent.$parent.$parent.$parent.$parent.$parent.datatableImpl.sortedColumn}" ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.uid" role="gridcell" tabindex="0" ui-grid-cell="">
                                            <div class="ui-grid-cell-contents" ng-bind-html="row.entity[col.field].content" title="Under construction">Under construction</div>
                                        </div>
                                        <!-- -->
                                        <div class="ui-grid-cell ui-grid-coluiGrid-0008" ng-class="{sorted: col.name==$parent.$parent.$parent.$parent.$parent.$parent.$parent.datatableImpl.sortedColumn}" ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.uid" role="gridcell" tabindex="0" ui-grid-cell="">
                                            <div class="ui-grid-cell-contents" ng-bind-html="row.entity[col.field].content" title="March 2018">March 2018</div>
                                        </div>
                                        <!-- -->
                                    </div>
                                </div>
                                <!-- -->
                                <!-- -->
                            </div>

我遇到了一个奇怪的错误。以下是出现问题的代码块:

 table = page_soup.findAll('div',attrs={"class" : "ui-grid-canvas"})
 print(type(table[0]))

 rows = table[0].findAll('div',attrs={"class": "ui-grid-row"})
 print(type(rows[0]))

 cell = rows[0].findALL('div')
 print(type(cells))

这些行返回以下内容:

 <class 'bs4.element.Tag'>
 <class 'bs4.element.Tag'>

 TypeError                                 Traceback (most recent call last)

 <ipython-input-56-13fce9e4b865> in <module>()
       5 print(type(rows[0]))  
       6 
 ----> 7 cell = rows[0].findALL('div')
       8 print(type(cells))

 TypeError: 'NoneType' object is not callable

为什么在上面直接检查变量类型时,这会返回一个类型错误,表明它是bs4.element.Tag,在表变量的情况下有效?

使用Ubuntu,Python 3.6和BS4。

提前致谢。

1 个答案:

答案 0 :(得分:1)

发生错误是因为从第二行开始,您有 comments (使用这些行:<!-- -->),而不是普通的标记元素。它们通常不会被BeautifulSoup方法捕获。这就是你的rows元素为空的原因。

访问评论所需的是使用Comment中的bs4对象。 我在这里回答了类似的问题: Accessing commented HTML Lines with BeautifulSoup