Используйте несколько строк JavaScript для извлечения всех гиперссылок на веб-странице, среда кодирования не требуется

Извлечение и очистка данных с веб-сайтов и документов - это мой хлеб с маслом, и мне очень понравилось учиться систематически извлекать данные с нескольких веб-страниц и даже с нескольких веб-сайтов с помощью Python и R. Но иногда проекту требуется лишь небольшой объем данных из всего одна страница на сайте.

Раньше, когда возникал подобный случай, я все равно запускал свою Python IDE или RStudio, писал и выполнял скрипт для извлечения этой информации. Это кувалда, чтобы расколоть орех. Обычный старый JavaScript достаточно мощный, чтобы извлекать информацию с одной веб-страницы, и этот JavaScript можно запустить в консоли разработчика браузера.

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

Что вам понадобится для этого проекта:

  • Буквально любой браузер, сделанный за последние 10 лет.
  • Кусок кода, который я приведу ниже.
  • Вот и все!

Код и как он работает

Откройте браузер (да, это работает даже в Internet Explorer, если вы обожаете наказания) и перейдите на страницу, с которой вы хотите извлечь ссылки.

В качестве примера я использую страницу Список запросов избранного комитета из парламента 2017 года - это страница с огромным количеством ссылок, которые в совокупности могут быть полезны многим людям.

Теперь нам просто нужно открыть консоль разработчика и запустить код. Чтобы открыть консоль разработчика, вы можете нажать F12 или щелкнуть страницу правой кнопкой мыши и выбрать «Проверить» или «Проверить элемент» в зависимости от выбранного браузера. Это откроет консоль, в которую вы можете ввести или скопировать и вставить фрагменты кода.

Это фрагмент кода, который вам нужно будет поместить в консоль:

var x = document.querySelectorAll("a");
var myarray = []
for (var i=0; i<x.length; i++){
var nametext = x[i].textContent;
var cleantext = nametext.replace(/\s+/g, ' ').trim();
var cleanlink = x[i].href;
myarray.push([cleantext,cleanlink]);
};
function make_table() {
    var table = '<table><thead><th>Name</th><th>Links</th></thead><tbody>';
   for (var i=0; i<myarray.length; i++) {
            table += '<tr><td>'+ myarray[i][0] + '</td><td>'+myarray[i][1]+'</td></tr>';
    };
 
    var w = window.open("");
w.document.write(table); 
}
make_table()

Затем просто нажмите Enter (или кнопку запуска в IE. Но почему вы используете IE ?!). В вашем браузере откроется новая вкладка с таблицей, содержащей весь текст ссылки и гиперссылки с выбранной вами веб-страницы.

Затем эту таблицу можно скопировать и вставить в электронную таблицу или документ, чтобы использовать их по своему усмотрению.

Что делает код?

Вот разбивка кода и то, что делает каждый аспект.

var x = document.querySelectorAll("a");
var myarray = []

Здесь мы находим все элементы «a» на странице (элементы a - это ссылки) и присваиваем их переменной x. Затем мы создаем переменную массива, но пока оставляем ее пустой.

for (var i=0; i<x.length; i++){
var nametext = x[i].textContent;
var cleantext = nametext.replace(/\s+/g, ' ').trim();
var cleanlink = x[i].href;
myarray.push([cleantext,cleanlink]);
};

Затем мы перебираем все элементы «a» в x, и для каждого элемента мы пытаемся найти текстовое содержимое элемента и ссылки.

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

function make_table() {
    var table = '<table><thead><th>Name</th><th>Links</th></thead><tbody>';
   for (var i=0; i<myarray.length; i++) {
            table += '<tr><td>'+ myarray[i][0] + '</td><td>'+myarray[i][1]+'</td></tr>';
    };
 
    var w = window.open("");
w.document.write(table); 
}
make_table()

Затем мы создаем таблицу с помощью функции «make_table ()». Это создает переменную table с началом таблицы HTML и заголовками таблиц. Затем мы используем цикл for для добавления строк таблицы, содержащих текст ссылки и гиперссылки.

Затем мы открываем новое окно с помощью «window.open ()» и записываем HTML-таблицу в это окно с помощью «document.write ()».

Но что насчет…?

У текущего кода есть недостаток - он займет ВСЕ ссылки на странице. Это означает все ссылки в меню, любые ссылки перехода, которые ведут к различным точкам на текущей странице, контакт, Условия и условия, ссылки на карту сайта в основании страницы и т. Д.

Вы можете быть более конкретными и искать все элементы «а» в определенной области веб-страницы. В случае со страницей запросов комитета, приведенной выше, нам просто нужно изменить первую строку кода, чтобы querySelector смотрел на определенную область страницы - возможно, только на список a-z в центре страницы.

Для этого щелкните правой кнопкой мыши область страницы, с которой вы хотите перейти по ссылкам, и нажмите «Проверить». После этого вы сможете увидеть, как называется этот элемент страницы. В этом случае элементом является «div» с классом «листинг от а до я». Мы можем просто изменить первую строку, чтобы искать все элементы «a» в элементе с классом «a-to-z -isting»:

var x = document.querySelectorAll(".a-to-z-listing a");

Я по-прежнему собираюсь использовать Python и R в подавляющем большинстве своих действий по парсингу, но полезно иметь быстрый и простой способ извлечения информации с веб-страницы без необходимости открывать какие-либо другие приложения.

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