【问题标题】:How to extract css data from already opened webpage in python如何从python中已经打开的网页中提取css数据
【发布时间】:2020-04-15 02:20:32
【问题描述】:

有一个游戏使用 hmtl 画布动态地在屏幕上放置对象。数据存储在 div 中,并有一个关联的 css id 来存储它的位置。您可以使用开发工具观察这些数据并检查每个元素。我希望能够在 python 中获得那些 x y 位置,但它必须来自已经打开并正在运行的选项卡(chrome 或 firefox)。我试过beautifulsoup,但似乎每次都打开一个新标签。我需要当前打开的选项卡中的数据。请注意,数据会经常更新。那么,我该怎么做呢?

或者也可以通过 javascript 来完成,但是,既然该选项卡上已经有一些 javascript 运行,该怎么办?

【问题讨论】:

  • 请尽量让它更清楚。你的目标是什么?你想对元素位置做什么?
  • 一旦我有了 x 和 y 坐标,我就可以让程序自动点击那个位置。就这些。由于项目是动态显示的,因此位置总是在变化。
  • BeautifulSoup 绝对不是你需要的。无论如何,这似乎过于宽泛/模糊,而且可能离题。
  • 这个怎么样。在网页中有一个 id 为 junk
    的 div 找到该 div 的 x y 位置并使用该位置单击它。一旦你点击它,那个 div 就会被移除并生成一个新的 div
    找到它的位置并点击它。以此类推。

标签: python html css beautifulsoup


【解决方案1】:

阅读您最近的评论后,您应该只需要 selenium。您不需要找到 x/y,因为您可以让 selenium 单击具有特定类的特定 div。

driver.findElementByClassName("junk1").click();

然后,如果需要,您可以使用sleepfor 循环使其在特定间隔内重复。这里有一些很好的资源:@​​987654321@、23Selenium documentation

【讨论】:

  • selenium 可以异步访问我需要的数据吗?
【解决方案2】:

我找到了解决方案或至少部分解决方案。该项目是为了好玩,但结果比最初预期的要复杂,这只是基本部分。

我所做的是: 1)为Firefox安装greasemonkey插件。 chrome有一个等价物 2)安装烧瓶

然后我用greasemonkey写了一个脚本。同样,可能不是伟大的代码,但我相信它会在某个地方帮助某人。

// ==UserScript==
// @name     js send data experiment
// @version  1
// @require       http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @grant       GM.xmlHttpRequest
// ==/UserScript==

let data = [
  {"who":"greasemonkey", "what":"Hi there4"}
 ];

GM.xmlHttpRequest({
    method: "POST",
    url: "http://localhost:5000/worker2",
    data: JSON.stringify(data),
  headers: {
    "Content-Type": "application/x-www-form-urlencoded"
    }
});

我不确定是否需要 ajax,但您肯定需要 @grant GM.xmlHttpRequest

然后我编写了这个 python 脚本,在命令行中运行它,一切正常。

#!flask/bin/python

import sys

from flask import Flask, render_template, request, redirect, Response
import random, json

app = Flask(__name__)

@app.route('/worker2', methods = ['POST'])
def worker2():
    # read json + reply
    data = request.get_json(force=True)
    print("**************** ")
    print(data)
    print("**************** ")
    return "success!!!"


if __name__ == '__main__':
    # run!
    app.run(debug=True)

【讨论】:

    猜你喜欢
    • 2019-06-19
    • 2012-06-09
    • 2015-04-12
    • 1970-01-01
    • 2014-01-19
    • 2019-02-24
    • 2017-10-16
    • 1970-01-01
    • 2017-09-08
    相关资源
    最近更新 更多