我目前正试图通过此网站对网页进行网页搜索: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)
但根本没有产生任何输出。感谢您的帮助。非常感谢你!
答案 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)