2016-11-06 1 views
0

У меня есть переменная с HTML кодом:Как пройти 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 не является функцией. Как перебирать HTML через div?

Обратите внимание: я не могу использовать JQuery из-за спецификации проекта.

EDIT:

Я получаю document is not defined когда я пытаюсь document.createElement('div') и 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; 
} 
} 
+1

Вы не можете пройти строку. Вы можете сделать это только на фактическом DOM –

+0

@NitzanTomer Oh. :(Если у меня есть файл BRITNEYSPEARS в моей папке проекта, который содержит HTML-код выше, как бы я ссылался на него, чтобы я мог его пересечь? – falafel

+0

«Спецификации проекта», которые мешают вам использовать jquery, почти наверняка будут исчезните, если вы объясните своему клиенту/боссу, сколько часов потребуется, чтобы сделать что-то подобное, что вы можете решить за считанные минуты с помощью правильных инструментов. Если, конечно, ваш клиент не любит платить за людей за изобретательность колес. – Paul

ответ

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)

+0

Спасибо. Это именно то, что мне нужно. Нужно ли мне что-то импортировать, чтобы сделать работу «document»? В моей среде IDE указано «Исходная ошибка: документ не определен». – falafel

+0

Нет, не нужно ничего импортировать, чтобы использовать 'document'.Это предназначено для запуска в браузере или узле? –

+0

Я не уверен, что вы подразумеваете под узлом. Приложение предназначено для браузера. Мое намерение состоит в том, чтобы использовать этот метод, чтобы захватить большую часть HTML и затем проанализировать его в структуре данных для запросов в браузере. Я, вероятно, дал вам некоторую неактуальную информацию, но лучше очертить ... – falafel

1

Вы также можете использовать DOMParser:

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

Я попытался создать DOMParser и получил 'DOMParseris не определен'. Можете ли вы посмотреть мое редактирование в OP и посмотреть, видите ли вы что-то не так? Это потому, что я использую node.js? Благодарю. – falafel

+0

Для node.js вам понадобится библиотека DOM. –

+0

Они предложили parse5. Я думаю, я был смущен, потому что я думал, что должен пересечь HTML, а затем разобрать его ... но должен ли я разобрать весь HTML-файл, а затем переместить его? – falafel

Смежные вопросы