2015-12-21 65 views
0

这是我在一周前发布的一个问题的扩展(getting text from html using beatifulsoup)。 似乎我想提取的大部分数据是data-bind,并且当我使用soup.findAll时不会“存储”。例如考虑这个链接:kaggle/user/results我想要获得用户参与的所有比赛的名称。我使用下面的代码:Python:使用BeatifulSoup从数据绑定中获取数据

url = 'https://www.kaggle.com/titericz/results' 
sourceCode = requests.get(url) 
plainText = sourceCode.text 
soup = BeautifulSoup(plainText) 
for link in soup.findAll('tr'): 
    print(link) 

所以我把第一场比赛,但在link似乎竞争,在这种竞争中的地位,总竞争对手等的名称的值丢失,而在HTML是那里。试图按照与上面链接的问题的答案相同的程序,但我无法管理它(通过使用re.compilepattern.search)。有没有办法通过使用BeatifulSoup来完成它?我无法在网上找到任何类似的问题。

+1

岂不是更好,如果你只使用基本的GET请求,我猜这就是它。 https://www.kaggle.com/scripts/all/0?userId=54836&sortBy=votes –

+0

感谢您的答案。你能更清楚吗?我应该遵循什么程序? –

+0

你可以直接从网址https://www.kaggle.com/knockout/profiles/54836/results以json的形式获取数据并解析它[用python解析json](https://docs.python.org/2 /library/json.html)。在这种情况下,你不需要美丽的装备 –

回答

2

你可以解析底层的get请求,它返回一个json字符串。

这里有一个小脚本,它会帮助你开始。

import requests 
import json 

jsonResponse = requests.get("https://www.kaggle.com/knockout/profiles/54836/results") 
data = json.loads(jsonResponse.text) 
print(data) 

for eachData in data: 
    print("competition name:", eachData["competition"]["title"]) 
    print("Rank:", eachData["rank"]) 
    print("competitors count:", eachData["teamCount"]) 

输出将是以下格式:

competition name: Digit Recognizer 
Rank: None 
competitors count: 933 
competition name: The Allen AI Science Challenge 
Rank: 110 
competitors count: 486 
+0

我正要发布类似的答案。我猜你比较快。 :P –