从HTML中抓取表(并且ID方法不起作用)

时间:2018-05-08 11:30:29

标签: python web-scraping

我目前正试图通过此网站对网页进行网页搜索:http://pusatdata.kontan.co.id/reksadana/produk/469/Schroder-90-Plus-Equity-Fund

特别是带有标题的灰色表格" TANGGAL / NAB / DIVIDEN / DAILY RETURN(%)"。

以下是我使用的代码:

import requests
import urllib.request
from bs4 import BeautifulSoup

quote_page = "http://pusatdata.kontan.co.id/reksadana/produk/469/Schroder-90-Plus-Equity-Fund"

page = urllib.request.urlopen(quote_page)

soup = BeautifulSoup(page, "html.parser")

table = soup.find('div',id='table_flex')

print (table.text)

但根本没有产生任何输出。感谢您的帮助。非常感谢你!

2 个答案:

答案 0 :(得分:0)

当您没有从代码中获得期望的结果时,您需要回溯以找出代码中断的位置。

在这种情况下,您的第一步是检查表的值。事实证明,table不是None(这表示选择器/ soup.find调用错误),所以你至少知道你没那么正确。

相反,您会注意到table_flex div为空。这对我来说并不是特别令人惊讶,但让我假装我什么都不知道,这没有任何意义。所以下一步就是启动浏览器并仔细检查DOM(通过浏览器的检查工具)是否有table_flex div中的内容。

确实如此,所以现在你必须做一些真正的挖掘。如果你在“table_flex”的inspect窗口中对DOM进行简单搜索,你将首先看到我们已经知道的div,但是你会在页面的下方看到一些引用“#table_flex”的Javascript / jQuery ”

这个Javascript是$ .ajax()调用的一部分(你可以google并找出它基本上是对网络服务器的查询以获取信息)。你还会注意到$(“#table_flex”)有一个html()方法(经过更多的谷歌搜索,你发现设置了特定元素的html内容)。

现在我们得到了div为什么为空的答案:当查询该页面的Web服务器时,服务器会发回一个包含空白表的文档。然后,期望查询方执行Javascript以填充页面的其余部分。一般来说,Python模块不运行Javascript(由于多种原因),因此表永远不会被填充。

这往往是动态内容的标准操作过程,因为“模板”网页可以缓存并快速分发(因为不需要额外的信息),然后根据用户需要提供其余信息。这也可以允许同一文档用于多个URL和查询参数,而无需生成新文档。

最终,对您来说最简单的方法是确定您是否可以直接访问该API,而只是查询该网址。

答案 1 :(得分:0)

没有生成输出,因为<div>内的标识为table_flex的文字没有。所以这不应该是一个惊喜。

有问题的“表格”可以在<div>下找到,标识为manajemen_reksadana。这两行不在<div>的正下方,整个“表”由<div>组成,因此最好导航到已知的标题/标签文本,并解决<div>包含与<div>相关的值以及标题/标签文本:

fund_management_node = soup.find('div', id='manajemen_reksadana')
for label_text in ['PRODUK', 'KATEGORI', 'NAB', 'DAILY RETURN']:
    label_node = fund_management_node.find(text=label_text).parent
    print(label_node.find_next_sibling('div').text)