使用BeautifulSoup刮取包含JavaScript的网页

时间:2017-03-30 14:13:51

标签: javascript python csv web-scraping beautifulsoup

家伙!我再次向你申请。我可以用标签抓取简单的网站,但最近我遇到了一个非常复杂的网站,里面有JavaScript。因此,我希望以表格(csv)的格式获取页面底部的所有估计值。比如“用户”,“收入估算”,“每次点击费用估算”。

我希望自己能够做到,但有点失败。

这是我的代码:

from urllib import urlopen
from bs4 import BeautifulSoup
html = urlopen("https://www.estimize.com/jpm/fq3-2016?sort=rank&direction=asc&estimates_per_page=142&show_confirm=false")
soup = BeautifulSoup(html.read(), "html.parser")
print(soup.findAll('script')[11].string.encode('utf8'))

输出格式奇怪,我不知道如何以适当的形式提取数据。  我会感激任何帮助!

2 个答案:

答案 0 :(得分:2)

您尝试提取的数据看起来像是在数据模型中,这意味着它在JSON中。如果您使用以下内容进行少量解析:

foreach ($your_object->DataFormItem->Values->fv as $fv_element) {
    echo $fv_element->Value." ".$fv_element->ID."<br>";
}

DataModel.parse是一个javascript方法,这意味着它以括号和冒号结束。函数的参数是您想要的JSON对象。通过将其加载到json.loads,您就可以像字典一样访问它。

从那里,您将数据重新映射到您希望它进入csv的表单。

答案 1 :(得分:1)

这就是我使用上面的一些提示解决问题的方法:

from bs4 import BeautifulSoup
from urllib import urlopen
import json
import csv

f = csv.writer(open("estimize.csv", "a"))
f.writerow(["User Name", "Revenue Estimate", "EPS Estimate"])

html = "https://www.estimize.com/jpm/fq3-2016?sort=rank&direction=asc&estimates_per_page=142&show_confirm=false"
html = urlopen(html)
soup = BeautifulSoup(html.read(), "html.parser").encode('utf8')
data_string = soup.split("\"allEstimateRows\":")[1]
data_string = data_string.split(",\"tableSortDirection")[0]
data = json.loads(data_string)

for item in data:
    f.writerow([item["userName"], item["revenue"], item["eps"]])