Perl: Сканирование основного текста для URI и удаление с использованием URI :: Find :: Simple - PullRequest
1 голос
/ 22 декабря 2019

Я пытаюсь отсканировать текст статьи в базе данных joomla для URI, которые приводят к 404. Если 404 найден, удалите якорь и просто оставьте полученный текст.

Код ниже успешнов поиске URI, но я понятия не имею, как затем удалить их из основного текста, оставив только текстовую часть ссылки.

Функция fetch_body () возвращает указатель на статью, гдеможно получить доступ к идентификатору, полному тексту и другим характеристикам.

Я также экспериментировал с HTTP :: Tiny, чтобы загрузить URL-адрес и проверить состояние, и, похоже, он работает правильно.

Есть лисуществующий модуль, который я могу использовать для удаления URL, оставляя только текст? Можно ли использовать URI :: Find: Simple для возврата всего HTML (якоря?), Окружающего URI?

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

  foreach my $ref (fetch_body($dbh)) {
     print "checking body: $ref->{'id'} ";
     my @uris     = URI::Find::Simple::list_uris($ref->{fulltext});
     foreach my $uri (@uris) {
        print "current uri: $uri\n";
        # check uri for status code here ***
        my $response = HTTP::Tiny->new->get($url);
        if ($response->{success}) {
             print "status: $response->{'status'}\n";
        } else {
             print "Failed: $response->{status} $response->{reasons}\n";
        }
     }
  }

Эти две другие функции просто открывают базу данных и возвращают указатель на статью в базе данных joomla.

  sub db_connect() {
  my %DB        = (
    'host'  => 'db.example.com',
    'db'    => 'db5',
    'user'  => 'joomla',
    'pass'  => 'joomlapass',
   );

   return DBI->connect("DBI:mysql:database=$DB{'db'};host=$DB{'host'}",$DB{'user'}, $DB{'pass'});
   }

   sub fetch_body ($) {
   $dbh  = shift;

   my $sql       = "select id, title, alias, urls, \`fulltext\`
                 FROM xxx_content
                WHERE state     = 1";
   my $sth       = $dbh->prepare($sql);
   my @rv        = ();

   $sth->execute();

   while (my $ref = $sth->fetchrow_hashref()) {
      push @rv, $ref;
   }
   $sth->finish();
   return @rv;
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...