【问题标题】:How to extract JSON serialization from HTML? C#如何从 HTML 中提取 JSON 序列化? C#
【发布时间】:2018-12-07 18:15:21
【问题描述】:

首先。作为 JSON 新手,我深表歉意。我想我的无知使我很难提出一个准确的问题。不用担心,我会在清楚后编辑和清理这篇文章。

我有一些来自第 3 方网站的 html,其中包含我想要提取的 JSON 数据。我编写了将 JSON 数据序列化/反序列化为 C# 类的单元测试。但是,我的离线测试输入文件是通过手动复制粘贴操作生成的:我打开 *.html 源,找到 JSON 序列化数据字符串,然后复制粘贴到离线文件中。然后我用它作为我的单元测试的输入。效果很好。

我想自动执行此手动复制/粘贴操作。

目前,我使用的 URL 返回 HTML - JSON 数据隐藏在某处的 HtmlDocument 中 - 我没有最模糊的方法来确定直接 JSON 查询 url 可能是什么,或者如何发现它.最好知道如何获得它。

在解释完这些背景信息后,我现在将提出我的问题。

从概念上讲,我认为可能有两个问题要问。应该只有一个,但我的无知在于:我不确定哪个问题更好问,或者我在下面发布的两个问题是否在球场上。我希望您从概念的角度理解我的要求,并且在我达成一些理解后,我可以将其修改为更技术/更准确的观点。请多多包涵。

Q1:在使用第三方网站时,如何确定直接请求 JSON 对象的 GET 字符串应该是什么?

这似乎是理想的解决方案,但我不明白确定应该如何构造 GET 请求的过程。我几乎没有触及在 Firefox 中使用 Inspector 工具来调查 html 的皮毛。使用此工具查找 JSON 请求 URL 字符串(对于 GET)对我来说是个谜。

Q2:在与第三方网站合作时,如何浏览 Html 找到可以提取 JSON 字符串的节点?

这是一个备用问题。如果答案是“不,你不能直接确定JSON URL GET字符串”,备份就是遍历Html,定位到包含JSON数据字符串的元素。

html 示例:(为了适合本文的内容,被大量截断)

...lots of html, followed by:

    <script>
      window.dataLayer = window.dataLayer || [];
         function gtag(){dataLayer.push(arguments);}
         gtag('js', new Date());
         gtag('config', 'UA-6441790-1');
    </script>
    <script>
      var result = {"teams":["tigers","sharks","destroyers","nerfs"]};
    </script>

...lots more html, followed by EOF.

并且JSON数据封装在var result字符串中

【问题讨论】:

    标签: javascript c# html json.net


    【解决方案1】:

    获取 HTML 文本,然后使用 HtmlAgilityPack 解析 HTML 并查找脚本标签。然后,您需要创建自己的代码,从许多代码中找到正确的脚本标签。也许通过匹配它的内容是否以var result = 开头。然后,您需要使用自己的代码将该 JSON 解析为文本。也许在var result = 之后获取所有内容并在最后一个; 进行修剪就足够了。然后,如果需要,您可以使用 JSON.NET 反序列化该 JSON。

    【讨论】:

    • 这行得通……它只是不优雅。嗯。我会将这个问题保持一段时间,看看我是否得到任何其他答案。我希望有更优雅的东西。这个解决方案的问题是,如果正则表达式停止工作(例如,在未来的某一天,他们突然将其更改为 'var result2=' 我的静态正则表达式将不起作用,因为它不再匹配)等
    • @sapbucket 如果他们不为您提供 api,这就是您必须忍受的现实。您需要匹配从页面解析的数据,他们还可以将 JSON 数据更改为不同的格式。您确定他们不提供可以获取此数据的 api 吗?也许您可以联系他们并询问?
    【解决方案2】:

    如果我理解正确的话:

    1. 如果您想动态获取 HTML(在代码中),您可以使用 HttpClient https://docs.microsoft.com/pl-pl/dotnet/api/system.net.http.httpclient?view=netframework-4.7.2 并发出简单的 GET 请求。它将返回结果(在本例中为 HTML)。在客户端你可以使用 jQuery 的负载 http://api.jquery.com/load/
    2. 关于 Q1:如果有人想为其他人提供一些数据,他们只需公开和 API(例如使用 REST)。如果是这种情况,他们还提供了一些 API 参考。前任。 https://api.stackexchange.com/docs 。 API 以舒适的方式提供数据,使用一些标准化的格式 ex。 JSON/XML。通常的做法是允许请求者指定他想要接收的格式(使用 Accept Mime Type)。
    3. 关于Q2:不能简单的浏览html来获取数据。 API 的文档指定了 urls/formats/expected output。另一方面,当您请求 HTML 或尝试遍历 html 以获取数据时,您无法确定结果。有一天,html 可能会发生变化,这将导致找不到您想要提取的数据。所以从响应的 html 中提取数据并不是一个好习惯。如果有人不公开可能意味着他们不想公开的 API?当然,如果您真的非常想要这些数据,您可以像描述的那样进行提取,但在提取数据时可能会出现提到的错误和不便。

    【讨论】:

    • 我同意我不想遍历 HTML。例如,似乎可以使用 REGEX 来提取字符串,但这非常微妙。对 HTML 的任何更改都可能破坏正则表达式。但是,与我合作的第 3 方肯定会公开 JSON 数据以供公众使用。但是没有文档。他们可能认为很容易弄清楚,他们不解释。这是一个如此简单但不平凡的问题。必须有一个优雅的解决方案。我会查看您发布的链接。
    • 你能分享第 3 方链接还是因为某些原因不能?也许他们正在托管一些自我描述的 api? .NET 有一个叫做 swagger swagger.io 的东西,它与您的代码一起构建“文档”。如果他们真的有方法假设他们的 API 很简单,我会感到惊讶。尽管它们是构建 API 的一些常见模式,但这样做完全是任意的
    • 我宁愿不公开他们的网站。但是,我确实有一个离线 html 文件。我不确定它是否会有很大帮助。我也不确定如何附在我的 SO 帖子上。似乎没有附加文件的选项。它是 255kB。太大,无法复制粘贴。
    • HTML 不会有太大帮助。我想知道它是什么样子的,如果我能以某种方式发现他们的 api,但在那种情况下,我无法提供更多帮助,抱歉
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多