Разделение строки элемента HTML на несколько строк - PullRequest
0 голосов
/ 04 апреля 2020

Я занимаюсь веб-копированием, используя кукловода, и пытаюсь извлечь innerText этого элемента h4.

<h4 class="loss">
(NA)
<br>
<span class="team-name">TEAMNAME</span>
<br>
<span class="win spoiler-wrap">0</span>
</h4>

Я могу получить этот элемент, используя:

const teamName = await matches.$eval('h4', (h4) => h4.innerHTML);

Это будет установите для teamName значение:

(NA)<br><span class="team-name">TEAMNAME</span><br><span class="win spoiler-wrap">0</span>

Я пытаюсь получить только внутренний текст каждого элемента.

Я могу получить (NA), используя const s = teamName.substr(0, teamName.indexOf('<'));

Но Я не могу понять, как получить "TEAMNAME" или "0" из этой строки. У меня есть мысли об использовании регулярных выражений, но я не уверен, как бы я выполнил sh this.

PS Внутренний текст не всегда будет одинаковым, поэтому я не могу искать конкретные c слова.

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

С помощью регулярного выражения вы можете сделать это следующим образом:

teamName.match(/<span class="team-name">(.*)<\/span>/)[1]

match возвращает массив, где первый элемент соответствует всему регулярному выражению, второй элемент соответствует первому группа регулярных выражений, третий элемент - это совпадение со второй группой регулярных выражений (в данном случае их нет), et c.

/.../ обозначает регулярное выражение, которое соответствует первому наибольшему совпадению, которое он может найти. . в регулярном выражении - любой символ. * указывает, что сопоставляется любое количество вхождений символа, включая 0 вхождений. (...) является группой регулярных выражений, которая используется match. \ является escape-символом, потому что / - это специальный символ для начала и окончания регулярного выражения.

Я очень рекомендую прочитать документы Mozilla в match и регулярные выражения для деталей. Вы часто найдете их полезными.

Однако в случае кукловода, вероятно, также есть способ прямого сопоставления селектора h4 span, который был бы более простым, чем использование регулярных выражений. Я не знаю достаточно о кукловоде, чтобы сказать вам точный способ сделать это. : /

0 голосов
/ 04 апреля 2020

Немного подумав, я смог решить свою проблему. Вот решение:

const teamName = await matches.$eval('h4', (h4) => h4.innerHTML);
    const openSpanGT = teamName.indexOf('>', 20);
    const closeSpanLT = teamName.indexOf('<', openSpanGT);
    const teamTitle = teamName.substr(openSpanGT + 1, closeSpanLT - openSpanGT - 1);


    console.log(teamTitle);

Это выведет «TEAMNAME» независимо от длины строки.

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