为什么这个标签在用美丽的汤解析时是空的?

时间:2014-12-06 03:32:48

标签: python html beautifulsoup html-parsing

我正在用漂亮的汤解析这个页面:

https://au.finance.yahoo.com/q/is?s=AAPL

我试图获得2014年9月27日(42,123,000)的总收入,这是近顶部声明中的首批价值之一。

我检查了chrome工具中的元素,发现该值位于类名为yfnc_tabledata1的表中。

我的python代码如下:

import requests
import bs4

#get webpage
page = requests.get("https://au.finance.yahoo.com/q/is?s=AAPL")

#put into beautiful soup
soup = bs4.BeautifulSoup(page.content)

#select tag
tag = soup.select("table.yfnc_tabledata1")

到目前为止一切顺利,这抓住了拥有所需数据的表格,但这就是我被困住的地方。

导致我想要的数据的链如下:

tag > tbody > tr > td > table > tbody > (then the second tr)

但是当我尝试使用它时,我得到一个空元素。

有人可以帮我吗?

另外,对于奖励积分,任何人都可以告诉我如何从更广泛的意义上学习如何提取这样的数据?我经常需要提取深埋在HTML文档中的数据,并且似乎永远无法找到正确的代码来获取我想要的数据。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:4)

HTML中没有<tbody>标记。

如果您使用浏览器查看该页面(例如使用Chrome开发者工具),则看起来有一个<tbody>标记,但这是由Chrome插入DOM的假标记。

尝试省略搜索链中的两个标记。我确信第一个不在那里(虽然HTML很难阅读)我很确定第二个也不存在。

更新:以下是您感兴趣的表格的HTML:

<TABLE class="yfnc_tabledata1" width="100%" cellpadding="0" cellspacing="0" border="0">
  <TR>
    <TD>
      <TABLE width="100%" cellpadding="2" ...>
        <TR class="yfnc_modtitle1" style="border-top:none;">
          <td colspan="2" style="border-top:2px solid #000;">
            <small><span class="yfi-module-title">Period Ending</span></small>
          </td>
          <th scope="col" style="border-top:2px ...">27/09/2014</th>
          <th scope="col" style="border-top:2px ...">28/06/2014</th>
          ...

所以没有<tbody>标签。

答案 1 :(得分:2)

让我们具体而实用

我们的想法是找到Total Revenue标签并使用.next_sibling获取下一个单元格的文字:

table = soup.find("table", class_="yfnc_tabledata1")
total_revenue_label = table.find(text=re.compile(r'Total Revenue'))
print total_revenue_label.parent.parent.next_sibling.get_text(strip=True)

演示:

>>> import re
>>> import requests
>>> import bs4
>>> 
>>> page = requests.get("https://au.finance.yahoo.com/q/is?s=AAPL")
>>> soup = bs4.BeautifulSoup(page.content)
>>> 
>>> table = soup.find("table", class_="yfnc_tabledata1")
>>> total_revenue_label = table.find(text=re.compile(r'Total Revenue'))
>>> total_revenue_label.parent.parent.next_sibling.get_text(strip=True)
42,123,000

答案 2 :(得分:1)

回答你的一般问题:

我建议书“挖掘社交网络”第二版。特别是第5章 - “挖掘网页”。

该书的源代码可用here on github

答案 3 :(得分:1)

认为可能有更好的方法来获取您想要的数据? 它是由许多机构免费提供多年的,例如:你想要的信息在哪里?

http://www.afr.com/share_tables/