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

Я использую node.js и puppeteer, чтобы перебрать кучу текстовых файлов, чтобы получить некоторые значения:

текстовый файл (извлекается)

<ABC-DOCUMENT>520.txt
<DOCUMENT>
<TYPE>INFORMATION TABLE
<SEQUENCE>2
<FILENAME>infotable.xml
<TEXT>
<XML>
<?xml version="1.0" ?>
<informationTable xsi:schemaLocation="/document/thirteenf/informationtable" xmlns="/document/thirteenf/informationtable" xmlns:n1="/document/thirteenf/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>
</ABC-DOCUMENT> 

Я использую следующий запрос (сообщение: Node.js puppeteer - выборка содержимого из сложного текстового файла ) для циклического перебора файлов:

мой сценарий:

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

Некоторые файлы имеют ns1: в начале:

TXT-файл (в данный момент пропускается):

<ABC-DOCUMENT>006.txt
<DOCUMENT>
<TEXT>
<XML>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:informationTable xmlns:ns1="/document/thirteenf/informationtable">
  <ns1:infoTable>
    <ns1:valueA>Company D</ns1:valueA>
    <ns1:valueB>INC</ns1:valueB>
    <ns1:shParent>
        <ns1:valueC>567</ns1:valueC>
        <ns1:valueD>AB</ns1:valueD>
    </ns1:shParent>
  </ns1:infoTable>
  <ns1:infoTable>
    <ns1:valueA>Company F</ns1:valueA>
    <ns1:valueB>Corp</ns1:valueB>
    <ns1:shParent>
        <ns1:valueC>692</ns1:valueC>
        <ns1:valueD>Ave</ns1:valueD>
    </ns1:shParent> 
  </ns1:infoTable>    
</ns1:informationTable>
</XML>
</TEXT>
</DOCUMENT>
</ABC-DOCUMENT>

Так что все эти файлы в данный момент пропускаются. Как я могу также прочитать эти файлы и получить значения?

1 Ответ

0 голосов
/ 04 сентября 2018

Вы можете использовать метод filter(), чтобы помочь выбрать соответствующие элементы, а затем вы можете использовать метод map(), чтобы извлечь textContent обратно в исходный массив:

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

    page.innerHTML = page_content;

    const all_elements = Array.from( page.querySelectorAll( '*' ) );

    return {
        'valueA' : all_elements.filter( e => e.tagName.endsWith( 'VALUEA' ) ).map( e => e.textContent ),
        'valueB' : all_elements.filter( e => e.tagName.endsWith( 'VALUEB' ) ).map( e => e.textContent ),
        'valueC' : all_elements.filter( e => e.tagName.endsWith( 'VALUEC' ) ).map( e => e.textContent ),
        'valueD' : all_elements.filter( e => e.tagName.endsWith( 'VALUED' ) ).map( e => e.textContent )
    };
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...