2017-08-26 111 views
0

试图从开放获取学术文章刮表,由于某些原因,我不能从这篇文章刮表,这是我所做的,但由此产生的ResultSet“表”是一个空名单。谢谢你的帮助。网络刮python表

from bs4 import BeautifulSoup 
import requests 

url_page = "http://www.sciencedirect.com/science/article/pii/S0378874116301696" 

content = requests.get(url_page).content 
soup = BeautifulSoup(content, "lxml") 
tables = soup.find_all("table") 
+2

什么是'html'? –

+0

对不起,我在复制代码时犯了一个错误,我现在编辑它应该是 – user3089520

回答

1

在这个页面的html中没有静态的<table>标签。这是一个基于React的页面,并且表格是使用javascript动态创建的。


编辑:添加一个脚本来获取数据

要凑这个网页,我看到两个选项:

  • 正如哈肯盖建议,您可以使用模拟浏览器模拟器能够执行JavaScript像ghost.py,phantomjs,HtmlUnit,Selenium等
  • 或者你可以浏览html/javascript源代码,观看浏览器请求并找到数据源。

我更喜欢第二个;此脚本打印页面的内容,包括表格中的数据:

# Python 3 
import requests, re, json 

def discard_format(dico): 
    if "_" in dico: 
     return dico["_"] 
    elif "$$" in dico: 
     return dico["$$"] 
    elif "$" in dico: 
     return "" 
    return dico 

url_page = "http://www.sciencedirect.com/science/article/pii/S0378874116301696" 
req = requests.get(url_page) 
html = req.content.decode("utf-8") 
token = re.search('"entitledToken":"(.*?)"', html).group(1) 
url_data = "http://www.sciencedirect.com/sdfe/arp/pii/S0378874116301696/body?entitledToken=%s" % token 
data = requests.get(url_data, cookies=req.cookies).content.decode("utf-8") 
#print(data) 
jsondata = json.loads(data, object_hook=discard_format) 
print(jsondata) 
+0

是的,这是正确的,但答案是什么?这比别的更重要。 –

+0

是的,是否可以指出如何去做? – user3089520

+1

你需要使用像硒这样的东西来刮这个网站。它不能用简单的http请求来完成,因为这些文章似乎并没有呈现在服务器端。 –