#javascript
#javascript
Вопрос:
Я извлекаю некоторые данные из таблицы и добавляю в массив, функция обрезки работает только с ведущими n
и t
и все еще сохраняет ведущие новые строки и вкладки.
Я посмотрел на Stackoverflow и использовал некоторые функции замены без результата.
const test = 'https://www.sec.gov/Archives/edgar/data/24741/000002474118000053/glw-20180930x10q.htm'
const request = require('request');
const cheerio = require('cheerio');
request(test, (error, res, html) => {
if (!error amp;amp; res.statusCode == 200) {
// console.log(html)
const $ = cheerio.load(html)
const table = $("tr:contains('Cash and cash equivalents')")
const items = []
items.push(table.text().trim())
console.log(items)
}
})
Мне нужно [cash and cash equivalents, 1903, ...]
вместо этого я получаю:
[ 'Cash and cash equivalentsnttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt1,903 nttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt4,317 nttttntttnttttntttttnttttttCash and cash equivalents at beginning of periodnttttnttttntttttntttttt nttttnttttntttttntttttt nttttntttt4,317 nttttnttttntttttntttttt nttttnttttntttttntttttt nttttntttt5,291 nttttntttnttttntttttnttttttCash and cash equivalents at end of periodnttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt1,903 nttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt3,865' ]
Комментарии:
1. Почему вы ожидаете такого вывода? При копировании текста из таблицы вы получите текст с разделителями табуляции.
2. обрезка работает только с концами строк
Ответ №1:
Вы получаете ответ в виде одной строки на свой запрос
trim()
применяется к строке и удаляет пустые символы только из ее начала и конца
для достижения желаемого вы можете использовать split()
эту строку по regex
/[n|t]/
ее значениям any tab or any newline
, а затем отфильтровать этот массив из пустых строк и элементов обрезки
let s = 'Cash and cash equivalentsnttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt1,903 nttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt4,317 nttttntttnttttntttttnttttttCash and cash equivalents at beginning of periodnttttnttttntttttntttttt nttttnttttntttttntttttt nttttntttt4,317 nttttnttttntttttntttttt nttttnttttntttttntttttt nttttntttt5,291 nttttntttnttttntttttnttttttCash and cash equivalents at end of periodnttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt1,903 nttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt3,865';
s = s.split(/[n|t]/)
.filter(el => el.trim().length)
.map(el => el.trim());
console.log(s)
PS: извините за мой английский
Ответ №2:
trim()
Функция удаляет пробелы только в начале и / или в конце строки. Чтобы удалить все вхождения n
и t
пробелов во всей строке, рассмотрите возможность использования replace()
со следующим регулярным выражением:
someString.replace(/[n|t]/gm, '')
Это в основном означает «сопоставлять каждый символ n или t в нескольких строках (m) глобально (g) по всей строке и заменять совпадения на «»
const inputString = 'Cash and cash equivalentsnttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt1,903 nttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt4,317 nttttntttnttttntttttnttttttCash and cash equivalents at beginning of periodnttttnttttntttttntttttt nttttnttttntttttntttttt nttttntttt4,317 nttttnttttntttttntttttt nttttnttttntttttntttttt nttttntttt5,291 nttttntttnttttntttttnttttttCash and cash equivalents at end of periodnttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt1,903 nttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt3,865'
const outputString = inputString.replace(/[n|t]/gm, '');
console.log(outputString);
Чтобы интегрировать это в свой код, вы могли бы сделать следующее:
items.push(table.text().replace(/[n|t]/gm, ''));
Комментарии:
1. Вместо чередования, не лучше ли использовать класс символов и, возможно, включать пробел?
.replace(/[tn]/gm, '')
или.replace(/[ tn]/gm, '')
?2. @StephenP хороший момент — только что обновленный ответ. Спасибо за предложение! 🙂
3. Я бы тоже рекомендовал рассмотреть возможность добавления
.replace(/s /g,' ')
в микс. Также, к вашему сведению, в этом сценарииm
модификатор не нужен.