И почему XPaths упростил код по сравнению с селекторами CSS

Код среднего скребка недействителен:

Код парсера для части Medium не работает, потому что используемые селекторы CSS недостаточно точны / не нацелены на нужные нужные узлы HTML. Действительно, извлеченные заголовки статей Medium не соответствуют ссылкам на связанные статьи Medium.

Его можно легко протестировать и проверить прямо в консоли предпочитаемого вами веб-браузера, введя и выполнив соответствующий код Javascript:

Уловка здесь заключается в том, чтобы запросить DOM для правильного селектора, сопоставляя только те узлы, которые мы хотим, и в конечном итоге отфильтровать узлы HTML, полученные путем применения критерия node.querySelector ('. Graf - title') (что означает, что нам нужен только «a» узлы, имеющие дочерний узел с классом graf - title.

Array.from(document.querySelectorAll(‘div.postArticle-content a:first-child[data-action-value]’))
  .filter( node => node.querySelector(‘.graf — title’))
  .map( link => (
    { 
      title: link.querySelector(‘.graf — title’).textContent, 
      link: link.getAttribute(‘data-action-value’) 
    }
  ))
);

У нас не было бы этой проблемы, если бы вместо использования селекторов CSS мы использовали селекторы XPath, такие как:

//div[@class=’postArticle-content’]/a[1][@data-action-value][.//*[contains(@class, ‘graf — title’)]]

Теперь у нас есть желаемые результаты:

Улучшить код парсера:

Декларативное программирование - это когда вы говорите, что хотите, а императивный язык - это когда вы говорите, как получить то, что хотите.

Код, используемый для написания парсера (шаг извлечения данных), в основном выполнен в стиле императивного программирования. Вместо того, чтобы сообщать, чего мы хотим достичь, этот код говорит только о том, как мы хотим это сделать.

Но должно быть наоборот: говорите, чего вы хотите достичь, а не как это делать.

Вместо использования сложной логики с сочетанием вызовов .forEach () и .map () мы могли бы просто сделать следующее:

Кроме того, безголовый браузер можно открыть только один раз, нет необходимости создавать новый экземпляр каждый раз, когда наш экспресс-сервер получает новый запрос.

Таким образом, мы экономим накладные расходы на запуск веб-браузера и всегда используем один и тот же экземпляр. Открытие новой веб-страницы / вкладки браузера занимает меньше времени. ‹

Надеюсь, это поможет :)