генерируйте ссылки страниц с постепенным увеличением переменной

Поскольку Вы обнаружили, этот метод является субоптимальным в лучшем случае В дополнение к HTML Вам будут нужны как минимум все изображения и CSS. Вам, возможно, также понадобится весь JavaScript. И затем существует целое соглашение рендеринга этой путаницы.

Но для Вас существуют хорошие новости в форме расширения Печати Командной строки, которое можно установить в Firefox.

Затем:

firefox -print http://www.example.com/index.html

На дополнительной странице документации существует больше примеров.

6
13.04.2017, 15:36
3 ответа

В Python можно использовать SequenceMatcher от difflib:

#!/usr/bin/env python
import difflib

url1 = "http://unix.stackexchange.com/questions/tagged/linux?page=2&sort=newest&pagesize=15"
url2 = "http://unix.stackexchange.com/questions/tagged/linux?page=3&sort=newest&pagesize=15"

matcher = difflib.SequenceMatcher(a=url1, b=url2)
matches = matcher.get_matching_blocks()

prefix = url1[:matches[0][2]]
suffix = url2[matches[1][1]:]

for i in range(2, 116):
    print prefix + str(i) + suffix

SequenceMatcher.get_matching_blocks() возвратится список утраивается формы (i, j, n), где a[i:i+n] == b[j:j+n]. Используя первые два такой утраивается, мы создаем префикс и суффикс URL, окружающего номер страницы, и выполняем итерации диапазона URL.

3
27.01.2020, 20:24

Не зная ничто больше о ссылках и принимая только изменения номера страницы, вот мой подход. Сначала я думал о diff -e, но оказывается, что это просто создает целую строку ed сценарий замены, который бесполезен как начальная точка.

Таким образом, вот чистое решение для удара:

#!/bin/bash
url1=${1:-"http://unix.stackexchange.com/questions/tagged/linux?page=2&sort=newest&pagesize=15"} 
url2=${2:-"http://unix.stackexchange.com/questions/tagged/linux?page=34&sort=newest&pagesize=15"}
pagenum=${3:-42}

function splitOnDigit() {
  prefix="${1%%[0-9]*}"
  url1="${1#$prefix}" # remainder if you strip the prefix
  url2="${2#$prefix}"
  suffix1="&${1#*&}" # remainder after the number
  suffix2="&${2#*&}"
  num="${url1%$suffix1}" # the number that we just split around
  if [[ $suffix1 == $1 ]]; then
    # if substitutions failed, we're at the end
    echo "$prefix$3"
    return
  fi

  if [[ $suffix1 == $suffix2 ]]; then
    echo "$prefix$3$suffix1"
  else
    echo -n "$prefix$num"
    splitOnDigit "$suffix1" "$suffix2" "$3"
  fi
}

splitOnDigit "$url1" "$url2" "$pagenum"

Это сравнивает две строки в блоках путем разделения один на числах. Просто сохраните его где-нибудь и выполните его — это является автономным. Рекурсивная часть там на всякий случай, изменяющаяся числовая часть не является первой, найденной как в Вашем примере.

Для генерации целого диапазона номеров страниц помещает все это в цикл (берет три аргумента: url1 url2 pagenumber, точно так же, как функция это реализует). Это достаточно быстро для работы как есть, но строковая порча могла быть сделана только однажды и сохранена как суффиксный префиксом парный промежуток, который Вы поместили свои числа итерации.

3
27.01.2020, 20:24

Вот сценарий Perl только, чтобы показать, как это - возможный Perl использования, поразрядный эксклюзивный или оператор (XOR) (^).

Сценарий

Я назвал его cmp.pl.

#!/usr/bin/perl -w

use strict;
use warnings;
# $s1 = "http://unix.stackexchange.com/questions/tagged/linux?page=2&sort=newest&pagesize=15";
# $s2 = "http://unix.stackexchange.com/questions/tagged/linux?page=3&sort=newest&pagesize=15";
# $np = 115

my $s1 = $ARGV[0];
my $s2 = $ARGV[1];
my $np = $ARGV[2];

my $posOfDiff;

my $mask = $s1 ^ $s2;
while ($mask =~ /[^\0]/g) {
  $posOfDiff = $-[0];
}


for (my $idx = 1; $idx <= $np; $idx++) {
  my $newStr = $s1;
  substr($newStr,$posOfDiff,1) = $idx;
  print "$newStr\n";
}

Подробнее

Уникальная функция этого сценария является использованием Perl (^) оператор. Питание этого подхода находится в этом отрывке кода:

my $mask = $s1 ^ $s2;
while ($mask =~ /[^\0]/g) {
  $posOfDiff = $-[0];
}

Вышеупомянутое создаст маску ($mask) использование 2 строк. Маска XOR является вектором, который будет содержать 0 для значений то соответствие между $s1 и $s2, и 1, где они отличаются. Можно добавить эту строку кода, если Вы хотите убедить себя в этом:

my $mask = $s1 ^ $s2;
printf "[$_] is 0x%02x\n", ord($_) for split //, $mask;

Внутренности маски

Это printf произведет вывод как это.Примечание: то, что символы являются непечатными, они - шестнадцатеричные значения. 0x00 является шестнадцатеричным значением для нулевого символа, 0x01 является 1.

...
[] is 0x00
[] is 0x00
[] is 0x00
[] is 0x00
[] is 0x00
[ ] is 0x01
[] is 0x00
[] is 0x00
...

Значение, возвращенное, когда что-либо кроме 0 означает значения, отличается. Другие примеры:

$ perl -we '$a="ab"; $b="ac"; $c=$a ^ $b; printf "[$_] is 0x%02x\n", ord($_) for split //, $c;'
[] is 0x00
[] is 0x01

$ perl -we '$a="ab"; $b="ad"; $c=$a ^ $b; printf "[$_] is 0x%02x\n", ord($_) for split //, $c;'
[] is 0x00
[] is 0x06

$ perl -we '$a="ab"; $b="ae"; $c=$a ^ $b; printf "[$_] is 0x%02x\n", ord($_) for split //, $c;'
[] is 0x00
[] is 0x07

Цикличное выполнение через маску

Другая интересная функция while цикл - то, что это циклично выполняется только через символы $mask это не пустые указатели (\0). Таким образом в Вашем примере, мы на самом деле только выполняем время цикла с условием продолжения 1, так как существует только 1 различие между 2 строками. Если бы было 2 различия, то это выполнилось бы 2 раза. Таким образом, это - довольно эффективный способ сделать это.

Если Вам нужно более убедительный, вот некоторые дополнительные строки кода, можно добавить что шоу while цикл в действии:

while ($mask =~ /[^\0]/g) {
  print "in the loop\n";
  print "what we're looking for:" . $-[0] . "\n";

Эти строки только отображены одно время:

in the loop
what we're looking for:58

Сохранение положения различия

После того как соответствие найдено, тело цикла с условием продолжения выполнится, и положение будет зарегистрировано в переменной $posOfDiff. Как? Красота здесь является использованием переменной, $ - [0]. Это даст нам смещение положения последнего успешного соответствия.

$ - [0] является смещением запуска последнего успешного соответствия.

Это соответствие - то, что происходит в части управления while цикл, мы ищем символы в $mask это не нулевой символ (\0), следовательно наш символ различия:

$mask =~ /[^\0]/g

Примечание: Запаздывание g говорит функции соответствия в Perl делать это глобально, таким образом, это будет продолжать находить соответствия, пока это не исчерпает строку, $mask.

Что еще?

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

Ссылки

5
27.01.2020, 20:24
  • 1
    На самом деле, его 0, где они соответствуют, и ненулевой, где они не соответствуют — не всегда 1. Его всего 1 для Вас, потому что Вы сравнили смежные символы, и они, оказалось, были частью ровно-нечетной пары. Тем не менее на быстрый взгляд, Ваш сценарий тестирует на не0, таким образом, его просто проблема с Вашим описанием. –  derobert 24.09.2013, 18:13
  • 2
    , например, perl -E 'print "ab"^"ad"' | xxd результаты в 0000000: 0006 .. –  derobert 24.09.2013, 18:14

Теги

Похожие вопросы