Node.js puppeteer - выборка содержимого из сложного текстового файла - PullRequest
0 голосов
/ 27 августа 2018

Как загрузить, получить доступ и обработать сложный текстовый файл в Puppeteer?

Я могу получить доступ к XML-файлу ( Node.js puppeteer - Загрузка / доступ к XML-файлу и обработка содержимого ) вот так:

await page.goto(myPage, {waitUntil: 'load'});   

const newPage = await page.evaluate(() => {

    var columns = document.getElementsByTagName("VALUEA");      

    var values = {"values":[]};

    for(let f in columns){
        values.values.push(columns[f].innerText);
    }

    return JSON.stringify(values);

});

console.log(JSON.parse(newPage))

Что возвращает мне нужные значения.Но если я хочу получить доступ к txt-файлу, похожему на этот ... и для тестирования хочу получить все 'VALUEA', я получаю:

{"values":[null,null,null]}

Это файл TXT, на который я смотрю:

<XYZ-DOCUMENT>117.txt : 20180824
<XYZ-HEADER>117.hdr.sgml : 20180824
<VALUE00>20180824153107
VALUE01:        117
VALUE02:    ABC

COMPANY:

    COMPANY DATA:   
        VALUE03:            Some Company
        VALUE04:            777

    BUSINESS ADDRESS:   
        VALUE05:        Some street
        VALUE06:            Some city

</XYZ-HEADER>
<DOCUMENT>
<VALUE07>ABC
<SEQUENCE>1
<FILENAME>primary_doc.xml
<TEXT>
<XML>
<?xml version="1.0" encoding="UTF-8"?>
<Submission xmlns="http://www.xyz.it/abc/" xmlns:com="http://www.xyz.it/abc/common">
  <headerData>
    <VALUE08>ABC</VALUE08>
    <xxxInfo>
      <xxx>
        <credentials>
          <VALUE09>777</VALUE09>
          <VALUE10>XXXXXXXX</VALUE10>
        </credentials>
      </xxx>
      <VALUE11>06-30-2018</VALUE11>
    </xxxInfo>
  </headerData>
  <bodyData>
    <coverPage>
      <VALUE12>06-30-2018</VALUE12>
      <VALUE13>1</VALUE13>
      <amendmentInfo>
        <VALUE14>STRAWBERRIES</VALUE14>
      </amendmentInfo>
      <xxxManager>
        <VALUE15>Corp</VALUE15>
        <address>
          <VALUE16:street1>MOUNTAIN STREET</VALUE16:street1>
          <VALUE17:city>NEW YORK</VALUE17:city>
        </address>
      </xxxManager>
      <provideInfoForInstruction5>N</provideInfoForInstruction5>
    </coverPage>
  </bodyData>
</Submission>
</XML>
</TEXT>
</DOCUMENT>
<DOCUMENT>
<TYPE>INFORMATION TABLE
<SEQUENCE>2
<FILENAME>xml_xyz.xml
<TEXT>
<XML>
<?xml version="1.0" encoding="UTF-8"?>
<informationTable xmlns="http://www.xyz.it/abc/informationtable" xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance">
<infoTable>
<VALUEA>Company A</VALUEA>
<VALUEB>INC</VALUEB>
<shParent>
<VALUEC>123</VALUEC>
<VALUED>AB</VALUED>
</shParent>
</infoTable>
<infoTable>
<VALUEA>Company B</VALUEA>
<VALUEB>LTD</VALUEB>
<shParent>
<VALUEC>567</VALUEC>
<VALUED>ST</VALUED>
</shParent>
</infoTable>

...

</informationTable>
</XML>
</TEXT>
</DOCUMENT>
</XYZ-DOCUMENT>

В конце я хочу получить все ЦЕННОСТИ (прежде всего, VALUEA, VALUEB, VALUEC, VALUEC)!Как это сделать?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вы можете использовать следующее решение для получения текстового содержимого из VALUEA, VALUEB, VALUEC и VALUED:

const example = await page.evaluate( () =>
{
    const page = document.createElement( 'html' );
    const page_content = document.body.textContent;

    page.innerHTML = page_content;

    return {
        'VALUEA' : Array.from( page.getElementsByTagName( 'VALUEA' ), e => e.textContent ),
        'VALUEB' : Array.from( page.getElementsByTagName( 'VALUEB' ), e => e.textContent ),
        'VALUEC' : Array.from( page.getElementsByTagName( 'VALUEC' ), e => e.textContent ),
        'VALUED' : Array.from( page.getElementsByTagName( 'VALUED' ), e => e.textContent )
    };
});

console.log( example.VALUEA[0] ); // Company A
console.log( example.VALUEA[1] ); // Company B

console.log( example.VALUEB[0] ); // INC
console.log( example.VALUEB[1] ); // LTD

console.log( example.VALUEC[0] ); // 123
console.log( example.VALUEC[1] ); // 567

console.log( example.VALUED[0] ); // AB
console.log( example.VALUED[1] ); // ST
0 голосов
/ 27 августа 2018

Для чтения как элементов dom html / xml внутри txt, одним из возможных решений является создание фиктивного узла dom, например:

var el = document.createElement( 'html' );
 el.innerHTML = "<tagelement>content</tagelement>";  

var columns = el.getElementsByTagName("tagelement");

Итак, в вашем примере:

const puppeteer = require('puppeteer');

(async () => {const browser = await puppeteer.launch ({headless: false}); const page = await browser.newPage (); await page.goto ('http://example.com/file.txt', {waitUntil:' load '});

const newPage = await page.evaluate(() => {

    var el = document.createElement( 'html' );
    el.innerHTML = document.getElementsByTagName("pre")[0].innerText;

    var allValues = el.querySelectorAll("VALUEA, VALUEB, VALUEC, VALUED");  

    var values = {};

    for(let i = 0; i<allValues.length; i++){
        if(!(allValues[i].nodeName in values)){
            values[allValues[i].nodeName] = [];
        }
        values[allValues[i].nodeName].push(allValues[i].innerText);

         }

        values =  JSON.stringify(values);

        return values;
    });

 console.log(JSON.parse(newPage))

}) ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...