【问题标题】:When webscraping with python and Beautifulsoup adding a class to a findAll() search brings back zero results?当使用 python 和 Beautifulsoup 进行网络抓取时,将类添加到 findAll() 搜索会返回零结果?
【发布时间】:2018-04-18 11:25:23
【问题描述】:

我是一般的编码新手。简而言之,我正在使用soup.findAll('table') 函数,它会带回网页上的所有表格。当我搜索soup.findAll('table', class_='playerTable rtable') 时,它会返回[]。我知道这是正确的类名,因为我从 HTML 中复制了它。你们知道为什么会发生这种情况吗?我在这里错过了什么?

我正在尝试从http://www.spotrac.com/nfl/denver-broncos/peyton-manning-5028/ 抓取网址

你们没有看到和我同一张桌子的原因是因为你需要登录一个帐户,这需要花钱才能访问信息,我的问题仍然存在,为什么会发生这种情况?当我知道我正在寻找的班级有一张桌子时。非常感谢大家的帮助!

【问题讨论】:

  • 你能发布你试图从中抓取的 URL 吗?
  • @TylerAnderson 我没有看到任何名为“playerTable rtable”的类。您能否给我一些有关您所指的物理页面部分的信息,以便我可以右键单击它并执行检查元素。
  • @TylerAnderson 我只看到一个名为“playerTable”的类
  • 当然,例如,如果您右键单击表格中的任何年份,例如 2012,它会将您拉到 td 中的“a href”,它位于 tr ( SalaryRow) 在 tbody 中,它在一堆其他的东西中,但在上面是 。我想找到所有那些 playerTable rtable 的。

标签: python html python-3.x web-scraping beautifulsoup


【解决方案1】:

对于您提供的链接,我没有看到任何名为“playerTable rtable”的类。也许你可以试试这个,让我知道它是否是你需要的。如果不适合您,很高兴删除/更改我的答案:

>>> r = BeautifulSoup(requests.get("http://www.spotrac.com/nfl/denver-broncos/peyton-manning-5028/").content, "lxml")
>>> r.findAll("table", attrs = {"class":"playerTable"})
[<table class="playerTable">
<tbody>
<tr>
<td class="contract-type">
<div>
<h2>
<span class="contract-type-logo"><img alt="Team contract signed with" src="http://d1dglpr230r57l.cloudfront.net/images/thumb/broncos.png"/></span>
<span class="contract-type-years">2016-2016 <small>Dead Money</small></span>
</h2>
</div>
</td>
</tr>
</tbody>
</table>, <table class="playerTable">
<tbody>
<tr>
<td style="padding-right:5px;">
<table class="salaryTable rtable current">
<thead>
<tr class="salaryRow">
<th class="header center">Year</th>
<th class="header center"> </th>
<th class="header salaryAmt center "><span>Base Salary</span></th>
<th class="header salaryAmt center"><span title="">Signing Bonus</span></th> <th class="header salaryAmt center"><span>Workout Bonus</span></th> <th class="header salaryAmt center"><span title="">Restruc. Bonus</span></th> <th class="header salaryAmt center"><span>Dead Cap Hit</span></th>
</tr>
</thead>
<tbody>
<tr class="salaryRow">
<td class="salaryYear center"><a href="http://www.spotrac.com/redirect/team/9/cap-2016/">2016</a></td>
<td class="salaryYear center"><img alt="Player contract details by year" src="http://d1dglpr230r57l.cloudfront.net/images/thumb/broncos.png"/></td>
<td class="salaryAmt ">-</td>
<td class="salaryAmt ">-</td> <td class="salaryAmt ">-</td> <td class="salaryAmt ">$2,500,000</td> <td class="salaryAmt ">$2,500,000</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>]

【讨论】:

  • 我正在寻找的是在类 'tablewrap' 的 'div' 下,它是一个在 html 中标记为 "
【解决方案2】:

这是因为page 上没有表同时具有 playerTablertable 类。而soup.findAll('table', class_='playerTable rtable') 是一个 AND 操作,即它将获取两个类的 table 元素,因此是空列表。

编辑:最后,这种行为的主要原因是用于获取 html 的未经身份验证的请求。因此不存在包含指定类的表。

【讨论】:

  • soup.findAll('table', class_='rtable') 会给我带来 html 中显示“playerTable rtable”的表格吗?
  • soup.findAll('table', class_='rtable') 将带来具有 rtable 类的表,但 soup.findAll('table', class_='playerTable rtable') 将带来具有这两个类的表。
  • 但在 html 中,我要查找的表是 &lt;table class="playerTable rtable"&gt;,它将 playerTable 和 rtable 列为类。这不是我想要的吗?要搜索包含两个类的表?
  • 是的,但我在您提供的链接所在的 html 页面中找不到包含这两个类的任何表。
  • @BOi 是的,对不起,我在过去三个小时里一直被这个问题困扰,我真的不想发帖,因为我认为这很愚蠢,但是我不知道出了什么问题。谢谢大家!你太棒了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 2023-01-17
  • 2021-11-21
  • 1970-01-01
  • 2016-08-18
  • 2022-12-17
  • 2020-08-09
相关资源
最近更新 更多