如何使用UnityWebRequest获取任意网站指定元素的文本内容?
在Unity中实现类似JS querySelector的网页元素提取功能
UnityWebRequest仅能获取网页的原始HTML文本,本身没有内置DOM解析能力,要实现类似querySelector的元素选择功能,需要借助第三方HTML解析库,最常用的是HtmlAgilityPack,以下是具体实现方案:
1. 导入HtmlAgilityPack到Unity
从NuGet下载兼容.NET Framework的HtmlAgilityPack版本,将HtmlAgilityPack.dll复制到Unity项目的Plugins文件夹(无此文件夹则新建)。
2. 修改请求代码,添加元素解析逻辑
下面的示例通过HtmlAgilityPack解析HTML,用XPath(类似CSS选择器的定位方式)提取指定元素的文本:
using UnityEngine; using UnityEngine.Networking; using HtmlAgilityPack; using System.Collections; public class API : MonoBehaviour { [SerializeField] private string url; // 替换为目标元素的XPath,例如//div[@class='target-content']/text() [SerializeField] private string elementXPath = "//h1/text()"; private void Start() { StartCoroutine(SendRequest()); } private IEnumerator SendRequest() { UnityWebRequest request = UnityWebRequest.Get(url); yield return request.SendWebRequest(); if (request.result != UnityWebRequest.Result.Success) { Debug.LogError($"请求失败: {request.error}"); yield break; } string htmlContent = request.downloadHandler.text; HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(htmlContent); // 提取目标元素文本 HtmlNode targetNode = doc.DocumentNode.SelectSingleNode(elementXPath); if (targetNode != null) { string requiredText = targetNode.InnerText.Trim(); Debug.Log("提取到的文本: " + requiredText); } else { Debug.LogWarning("未找到目标元素"); } } }
3. 选择器使用说明
- 若习惯CSS选择器语法,可添加
HtmlAgilityPack.CssSelectors扩展库,就能用doc.DocumentNode.QuerySelector(".target-class")的写法,和JS的querySelector完全一致。 - 常用XPath示例:
- 提取class为
main-title的元素文本://*[@class='main-title']/text() - 提取id为
content-box的div内文本://div[@id='content-box']/text()
- 提取class为
补充:WebGL平台专属方案
如果项目是WebGL,可以直接通过JS交互调用浏览器DOM API:
using UnityEngine; using UnityEngine.Networking; using System.Collections; public class API : MonoBehaviour { [SerializeField] private string url; [SerializeField] private string cssSelector = ".target-element"; private void Start() { StartCoroutine(SendRequest()); } private IEnumerator SendRequest() { UnityWebRequest request = UnityWebRequest.Get(url); yield return request.SendWebRequest(); if (request.result != UnityWebRequest.Result.Success) { Debug.LogError($"请求失败: {request.error}"); yield break; } // 将HTML传递给JS解析 string html = request.downloadHandler.text; Application.ExternalCall("extractElementText", html, cssSelector); } // 接收JS返回的提取结果 public void OnTextExtracted(string text) { Debug.Log("JS提取到的文本: " + text); } }
在WebGL的HTML模板中添加对应JS函数:
function extractElementText(html, selector) { let tempContainer = document.createElement('div'); tempContainer.innerHTML = html; let targetElement = tempContainer.querySelector(selector); let result = targetElement ? targetElement.textContent.trim() : "未找到目标元素"; // 回调Unity的接收方法 SendMessage('API', 'OnTextExtracted', result); }
内容的提问来源于stack exchange,提问作者svinomisl
相关产品推荐
相关产品推荐

