9

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

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

4

3 回答 3

4

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

Chromium 如何显示网页:概念应用层

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

不同的层描述为:

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

由于您的目标是按元素和/或类访问和解释网页的 HTML 内容,因此您可以查看使用 Blink的呈现过程:

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

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

WebDocument document = GetMainFrame()->GetDocument();
WebElement element = document.GetElementById(WebString::FromUTF8("example"));
// document.Url();
于 2018-09-06T21:00:38.847 回答
2

最干净的将是通过 chrome远程调试协议

使用 DOM 方法获取根 DOM 并遍历、搜索或查询 dom

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

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

于 2018-09-07T13:27:18.787 回答
2

您需要使用服务器端库来解析请求的 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/

于 2018-09-07T15:32:58.657 回答