【问题标题】:How to traverse HTML如何遍历 HTML
【发布时间】:2017-03-20 05:53:58
【问题描述】:

我有一个带有 HTML 代码的变量:

let htmlDocument = '<div id="buildings-wrapper"> \
    <div id="building-info"> \
    <h2><span class="field-content">Britney Spears' House</span></h2> \
    <div class="building-field"> \
    <div class="field-content">9999 Hollywood Blvd</div> \
    </div> \
    <div class="building-field"> \
    <div class="field-content">Building Hours: Mon. 07:00-23:00 Tue.-Fri. 06:30-22:00, Sat. 07:30-18:00, Sun. 12:00-18:00 Holidays - Closed</div> \
    </div> \
    <div class="building-field"> \
    <div class="field-content"><a href="http://www.britneyspears.com">Locate on the stars map</a></div> \
    </div> \
    </div> \
    <div id="building-image"> \
    <div class="field-content"><img src="../../../../ssc.adm.britneyspears.com/classroomservices/image/viewimage?userEvent=ShowBuildingImage&amp;buildingID=britneyspears" alt="Image of BritneySpears"></div> \
        </div> \
        </div>';

我想遍历变量并将这部分 HTML 存储在一个单独的变量中:

<div class="field-content">9999 Hollywood Blvd</div>

这是我目前所拥有的:

public traverseHTML(htmlDocument: any): any {
    let htmlBlock: any;
    let divs: any = htmlDocument.getElementsByTagName('div');
    for (var i = 0; i < divs.length; i++) {
        if (divs[i].getAttribute("id") == "field-content") {
            htmlBlock = divs[i];
        }
    }
    return htmlBlock;
}

我确定我的功能存在各种问题,但我无法解决它们,因为我什至无法通过第二行。我收到一条错误消息,提示 htmlDocument.getElementsByTagName 不是函数。如何通过 div 遍历 HTML?

请注意,由于项目规范,我不能使用 JQuery。

编辑:

当我尝试document.createElement('div') 时收到document is not defined,而当我尝试创建 DOMParser 时未定义 DOMParser。我设置的课程不正确吗?这是整个类的代码:

import parse5 = require('parse5');
import {ASTNode} from 'parse5';



export default class DSController {
//private parser: DOMParser;

constructor() {
    //this.parser = new DOMParser();
}

public traverseHTML(htmlDocument: any): any {
    let parser = new DOMParser();
    let parsed: any = parser.parseFromString(htmlDocument, "text/html");
    let selectParsed: any = parsed.querySelectorAll('field-content')[1];
    console.log(selectParsed);

    return selectParsed;

   /* let element = document.createElement("div");
    element.innerHTML = htmlDocument;
    console.log(element.querySelectorAll(".field-content")[1]); // <div class="field-content">9999 Hollywood Blvd</div>
    */
}




public parseHTML(): any {

    //let document: parse5.ASTNode;
    return;
}
}

【问题讨论】:

  • 不能遍历字符串。您只能在实际的 DOM 上执行此操作
  • @NitzanTomer 哦。 :( 如果我的项目文件夹中有一个名为 BRITNEYSPEARS 的文件,其中包含上面的 HTML 代码,我将如何引用它以便遍历它?
  • 如果您向您的客户/老板解释完成这样的事情需要多少小时,那么阻止您使用 jquery 的“项目规范”几乎肯定会消失,您可以使用正确的工具在几分钟内解决。当然,除非您的客户喜欢花钱请人重新发明轮子。
  • @Paul 这是给学校的,所以不管项目描述怎么说,不幸的是。
  • @Azamantes 直到现在我才知道多行字符串的反引号!

标签: javascript html node.js typescript traversal


【解决方案1】:

您可以创建一个元素,然后将此字符串作为 html 插入其中。
然后您可以查询此元素以查找您要查找的内容:

let htmlDocument = '<div id="buildings-wrapper"> \
    <div id="building-info"> \
    <h2><span class="field-content">Britney Spears House</span></h2> \
    <div class="building-field"> \
    <div class="field-content">9999 Hollywood Blvd</div> \
    </div> \
    <div class="building-field"> \
    <div class="field-content">Building Hours: Mon. 07:00-23:00 Tue.-Fri. 06:30-22:00, Sat. 07:30-18:00, Sun. 12:00-18:00 Holidays - Closed</div> \
    </div> \
    <div class="building-field"> \
    <div class="field-content"><a href="http://www.britneyspears.com">Locate on the stars map</a></div> \
    </div> \
    </div> \
    <div id="building-image"> \
    <div class="field-content"><img src="../../../../ssc.adm.britneyspears.com/classroomservices/image/viewimage?userEvent=ShowBuildingImage&amp;buildingID=britneyspears" alt="Image of BritneySpears"></div> \
        </div> \
        </div>';

let element = document.createElement("div");
element.innerHTML = htmlDocument;

console.log(element.querySelectorAll(".field-content")[1]); // <div class="field-content">9999 Hollywood Blvd</div>

(code in playground)

【讨论】:

  • 谢谢。这正是我所需要的。我是否需要导入一些东西才能使document 工作?我的 IDE 显示 Reference error: document is not defined
  • 不,应该不需要导入任何东西来使用document。这打算在浏览器或节点上运行吗?
  • 我不确定你所说的节点是什么意思。该应用程序适用于浏览器。我的目的是使用这种方法来获取更大的 HTML 部分,然后将其解析为数据结构以便在浏览器中查询。我可能给了你一些不相关的信息,但最好过度分享......
  • 您应该能够编译此代码而无需导入任何其他内容。因为它在我发布的操场链接中有效。您使用的是什么 IDE?
  • 是的,我看到该文档是标准的lib.d.ts 的一部分。我正在使用 Webstorm。
【解决方案2】:

你也可以使用DOMParser:

new DOMParser().parseFromString(htmlDocument, "text/html")
  .querySelectorAll('.field_content)[1]

【讨论】:

  • 我尝试创建一个 DOMParser 并得到了DOMParseris not defined。你能看看我在 OP 中的编辑,看看你有没有发现什么问题?是因为我使用的是 node.js 吗?谢谢。
  • 对于 node.js,你需要某种 DOM 库。
  • 他们建议使用 parse5。我想我一直很困惑,因为我认为我应该遍历 HTML 然后解析它......但是我应该解析整个 HTML 文件然后遍历它吗?
  • 您混淆了“解析”和“提取”。 “解析”是指根据某种语法(如 HTML)分析字符串并生成可处理的表示(如 DOM)。当你这样做了,只有这样,你才能从表示中“提取”一些东西,比如你感兴趣的div元素。
  • 谢谢,这真的很有帮助。我一直在尝试提取然后解析一整天。 D:
猜你喜欢
  • 1970-01-01
  • 2020-03-30
  • 2022-01-24
  • 2021-09-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2022-11-17
  • 2020-05-07
相关资源
最近更新 更多