【问题标题】:Where to find entire HTML content in Chromium source code在 Chromium 源代码中哪里可以找到完整的 HTML 内容
【发布时间】:2018-08-30 11:23:33
【问题描述】:

我目前正在尝试这样做:一旦网页加载,找出 URL 是否具有某种模式(例如 www.wikipedia.com/*),然后,如果是,则解析该网页的 HTML 内容,就像可以做的那样BeautifulSoup,并检查网页是否有 divfoo 和 id boo。知道我可以在哪里编写这段代码,也就是说,我在哪里可以访问 URL,我需要在哪里听才能知道网页已经完成加载,然后我可以查找 URL 和 HTML 内容,以及在哪里和如何解析 HTML?

我尝试查看src/chrome/browser/tab_contents 中的代码,但找不到任何合理的地方可以完成所有这些操作。

【问题讨论】:

  • Chromium 使用多进程架构,网页的渲染是在渲染进程中完成的。页面加载完成后,将调用此方法:cs.chromium.org/chromium/src/content/renderer/…。如果您想了解更多信息,您可能需要从那里进行调试
  • 谢谢阿塞什。知道如何访问整个网页的 HTML 吗?
  • 您想在调试时访问源代码还是通过 API 访问源代码?
  • 根据您的需要,Tampermonkey 的用户脚本可能就足够了:openuserjs.org/about/Tampermonkey-for-Chromium
  • 谢谢大家。我一直在寻找一种原生方式,通过 C++,而不是通过脚本或扩展。

标签: google-chrome chromium webviewchromium


【解决方案1】:

看看以下代表 Chromium 如何显示网页的概念应用层

图片来源:https://docs.google.com/drawings/d/1gdSTfvLxbJDbX8oiWo5LTwAmXmdMQvjoUhYEhfhj0-k/edit

不同的层是described为:

  • WebKit: 在 Safari、Chromium 和所有其他基于 WebKit 的浏览器之间共享的渲染引擎。 Port 是 WebKit 的一部分,它与平台相关的系统服务(例如资源加载和图形)集成。
  • Glue: 将 WebKit 类型转换为 Chromium 类型。这是我们的“WebKit 嵌入层”。它是两个浏览器 Chromium 和 test_shell(允许我们测试 WebKit)的基础。
  • 渲染器/渲染主机:这是 Chromium 的“多进程嵌入层”。它跨进程边界代理通知和命令。
  • WebContents: 一个可重用的组件,它是 Content 模块的主类。它很容易嵌入以允许将 HTML 多进程渲染到视图中。请参阅content module pages 了解更多信息。
  • 浏览器:代表浏览器窗口,它包含多个WebContentses。
  • Tab Helpers: 可以附加到 WebContents 的单个对象(通过 WebContentsUserData mixin)。浏览器将它们的分类附加到它所拥有的 WebContentses(一个用于网站图标,一个用于信息栏等)。

由于您的目标是按元素和/或类访问和解释网页的 HTML 内容,您可以查看渲染过程which uses Blink

渲染器使用 Blink 开源布局引擎来解释和布局 HTML。

Blink 有一个WebDocument class,它允许您访问网页的 HTML 内容和其他属性:

WebDocument document = GetMainFrame()->GetDocument();
WebElement element = document.GetElementById(WebString::FromUTF8("example"));
// document.Url();

【讨论】:

  • 还要记住,渲染进程在沙箱中运行
【解决方案2】:

最干净的是通过 chrome remote debugging protocol

使用DOM方法获取根DOM和walk, search, or query the dom

这也将使测试变得更简单:您可以使用现有的客户端库(有很多)以您最喜欢的脚本语言实现逻辑,并且一旦成功,就可以在 C++ 中实现它。

如果由于某种原因必须在 Chromium 中进行处理,则下一步启动一个连接到此的线程并执行操作。

【讨论】:

  • 你能提供一些示例代码,并解释它到底适合哪里,我为页面加载完成添加一个侦听器,然后获取我的类型的元素,比如一个带有 id 的文本框foo?
【解决方案3】:

您需要使用服务器端库来解析请求的 HTML 页面的内容。例如,在 Java 中有一个库“jsoup”,可能还有其他服务器端语言的替代方案。由于安全限制,您可以找到的主要问题是“禁止访问”,但是因为您没有尝试访问 REST 服务或类似的东西,而只是解析纯 HTML 以找到 字符串模式,必须用“jsoup”轻松完成。有一个项目,其中编写了类似的东西来访问网站页面并解析响应 html 字符串。

Document doc = Jsoup.connect("http://jsoup.org").get();
Element link = doc.select("a").first();
String relHref = link.attr("href"); // == "/"
String absHref = link.attr("abs:href"); // "http://jsoup.org/"

见:https://jsoup.org/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    相关资源
    最近更新 更多