我解析与美丽的汤本页面:
https://au.finance.yahoo.com/q/is?s=AAPL
我试图得到27/09/2014(42123000)的总收入是在靠近顶部的语句中的第一个值。
我检查的元件在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文档中深埋数据,并可以似乎从来没有制定出正确的代码来获得我想要的数据。
非常感谢任何帮助表示赞赏。
让我们具体而实际 。
我们的想法是找到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
没有<tbody>
在HTML标签。
如果你看看一个浏览器(例如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>
标记。
要回答你一般的问题:
我建议书“挖掘社交网络”第二版。 特别是第5章 - “采矿网页”。
这本书的源代码可以在这里GitHub上 。
我认为有可能得到你想要的数据的更好的方法? 它已经被一些机构免费提供了数年,例如,是你想在这里的某个地方的信息?
http://www.afr.com/share_tables/