【问题标题】:web scraping a table with python网络用python刮一张桌子
【发布时间】:2018-02-04 08:42:43
【问题描述】:

试图从开放获取学术文章中抓取表格,由于某些原因我无法从本文中抓取表格,这就是我所做的,但生成的 ResultSet“表格”是一个空列表。谢谢你的帮助。

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" )

【问题讨论】:

  • 什么是html
  • 对不起,我在这里复制代码时出错了,我现在按原样编辑了它

标签: python html-table beautifulsoup screen-scraping


【解决方案1】:

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


编辑:添加脚本以获取数据

要抓取此页面,我看到两个选项:

  • 按照 Håken Lid 的建议,您可以使用能够执行 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)

【讨论】:

  • 是的,这是正确的,但答案是什么?这更像是一种评论。
  • 你需要使用 selenium 之类的东西来抓取这个站点。它不能用普通的 http 请求来完成,因为文章似乎没有呈现在服务器端。
  • 是的@cᴏʟᴅsᴘᴇᴇᴅ,我想写评论,但不幸的是我没有足够的声誉点来做这件事..
  • @user3089520 我编辑了答案以添加脚本抓取数据而不解析 html。您是否获得了您想要的所有数据,或者您真的需要解析完整的详细 html?
  • 您的代码有效,但我仍在努力理解它。这条线是干什么用的?为什么要搜索“entitledToken”? token = re.search('"entitledToken":"(.*?)"', html).group(1)
猜你喜欢
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 2019-08-23
  • 2013-11-08
  • 1970-01-01
相关资源
最近更新 更多