【问题标题】:AttributeError - webscraping - Python - SeleniumAttributeError - 网络抓取 - Python - Selenium
【发布时间】:2020-09-04 07:09:36
【问题描述】:

我需要从网上抓取下表,我无法使用“find_all”功能解决问题。 PyCharm 总是说:

AttributeError: 'NoneType' object has no attribute 'find_all'

我不知道出了什么问题。尝试使用 table.find_all("tr") 或 table.find_all('tr') 字符和下一个属性,如 table.find_all("tr", attrs={"class": "table table-export"}) 和下一个选项,没有任何效果。 请问你能告诉我我做错了什么吗?

表:

<div class="table-options">
    <table class="table table-export">
                <thead>
                <tr>
                    <!-- ngIf: ActuallyPoints && ActuallyPoints.name == 'AXB' --><th ng-if="currentRole &amp;&amp; currentRole.name == 'AXB'" class="id check">
                        <label ng-click="selectAll()"><input disabled="" id="select-all" type="checkbox" ng-model="all" class="valid value-ng">All</label>
                    </th><!-- end ngIf: currentRole && currentRole.name == 'AXB' -->
                    <th>AAA</th>
                    <th>BBB</th>
                    <th>CCC</th>
        </tr>
                </thead>
                <tbody>
<!-- ngRepeat: x in ErrorStatus --><tr ng-repeat="x in ErrorStatus" class="random-id">
                    <!-- ngIf: currentRole && currentRole.name == 'AXB' --><td ng-if="currentRole &amp;&amp; currentRole.name == 'AXB'" class="random-id">
                        <input type="checkbox" ng-model="x.checked" ng-change="selectOne(x)" class="valid value-ng">
                    </td><!-- end ngIf: currentRole && currentRole.name == 'AXB' -->
                    <td class="pax">111</td>
                    <td class="pax">222</td>
                    <td class="pax">333</td>
                    </td>
                </tr><!-- end ngRepeat: x in ErrorStatus -->
                </tbody>
            </table>
        </div>

代码:

import lxml
from urllib.request import urlopen
from bs4 import BeautifulSoup

url = 'xxx'
website = request.urlopen(url).read()

soup = BeautifulSoup(website, "lxml")

table = soup.find("table", attrs={"class": "table table-export"})
rows = table.find_all('tr')

非常感谢。

【问题讨论】:

  • 您尝试抓取的网址是什么。请在您的代码中添加它
  • 很抱歉,这是一个带有机密数据库的私人网址,很遗憾,我无法与所有人共享它,并且需要登录..
  • 那么我担心你在这里得不到任何帮助。如果其他人不能实时复制问题,那么它不值得解决。

标签: python selenium web-scraping beautifulsoup attributeerror


【解决方案1】:

我将无法提供解决方案,因为没有链接,但错误的解释很简单:

AttributeError: 'NoneType' object has no attribute 'find_all'

让我们看看你在代码中哪里使用了.find_all

rows = table.find_all('tr')

考虑到解释器所说的,这段代码实际上是这样的:

rows = None.find_all('tr')

换句话说,您的变量table 等于None。因此,您的问题就在这里:

table = soup.find("table", attrs={"class": "table table-export"}) # returns None

在人类语言中,您试图在 html 中查找某个表,然后将其存储到变量 table,但 soup.find() 使用您提供的说明无法找到该元素,因此返回了 @ 987654330@。你没注意到,尝试调用None.find_all(),但是None没有这个方法。

这就是您收到此错误的原因。如果您无法共享链接,请自行重新检查此部分,因为它不起作用:

table = soup.find("table", attrs={"class": "table table-export"}) # returns None

UPD:首先,尝试打印变量 soup 并检查表是否存在,因为您在浏览器中看到的 html 和您通过请求收到的 html 可能完全不同:

soup = BeautifulSoup(website, "lxml")
print(soup)

【讨论】:

    猜你喜欢
    • 2021-08-11
    • 2020-10-29
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    相关资源
    最近更新 更多