Как извлечь столбец из этой сгенерированной таблицы? - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть эта сгенерированная таблица, и я хочу проанализировать ее с помощью Mojo :: DOM и извлечь столбцы «Имя пользователя» и «Нет. комментарии в 2 разных массивах. Я не могу понять, как это сделать. Вы можете помочь мне? Или, может быть, какое-то руководство к какой-то документации. Большое спасибо, ребята!

#           <table class="table table-hover">
#             <thead>
#               <th>Username</th>
#               <th>Tip</th>
#               <th>Last login</th>
#               <th>No. comments</th>
#             </thead>
#                 <tr>
#                   <td><a href="/user/user8"
#                     >user8</a></td>
#                   <td>level2</td>
#                   <td class="dateTime">2019-09-26 00:00:00</td>
#                   <td>0</td>
#                 </tr>
#                 <tr>
#                   <td><a href="/user/user9"
#                     >user9</a></td>
#                   <td>level2</td>
#                   <td class="dateTime">2019-09-26 00:00:00</td>
#                   <td>0</td>
#                 </tr>
#                 <tr>
#                   <td><a href="/user/user11"
#                     >user11</a></td>
#                   <td>level2</td>
#                   <td class="dateTime">2019-09-26 00:00:00</td>
#                   <td>0</td>
#                 </tr>
#                 <tr>
#                   <td><a href="/user/user1"
#                     >user1</a></td>
#                   <td>level1</td>
#                   <td class="dateTime">2020-02-28 10:43:09</td>
#                   <td>23</td>
#                 </tr>
#                 <tr>
#                   <td><a href="/user/user2"
#                     >user2</a></td>
#                   <td>level1</td>
#                   <td class="dateTime">2020-02-28 10:43:10</td>
#                   <td>2</td>
#                 </tr>
#                 <tr>
#                   <td><a href="/user/user3"
#                     >user3</a></td>
#                   <td>level1</td>
#                   <td class="dateTime">2020-02-28 10:43:10</td>
#                   <td>3</td>
#                 </tr>
#                 <tr>
#                   <td><a href="/user/user4"
#                     >user4</a></td>
#                   <td>level1</td>
#                   <td class="dateTime">2020-02-28 10:43:11</td>
#                   <td>4</td>
#                 </tr>
#                 <tr>
#                   <td><a href="/user/user5"
#                     >user5</a></td>
#                   <td>level1</td>
#                   <td class="dateTime">2020-02-28 10:43:11</td>
#                   <td>5</td>
#                 </tr>

Ответы [ 2 ]

3 голосов
/ 28 февраля 2020

извлечь столбцы «Имя пользователя» и «Нет. комментарии в 2 разных массивах

Это почти наверняка плохая идея. Хранение связанных данных в двух отдельных структурах данных - путь к катастрофе. Гораздо лучше хранить эти данные в массиве хэшей.

Адаптируя уже полученный ответ:

use Mojo::DOM;

my @users;

my $dom = Mojo::DOM->new->parse(do { local $/ = undef; <DATA>});

$dom->find('table.table tr')->each(sub {
    my $cells = $_->find('td');

    my $user = {
      name          => $cells->[0]->all_text, # because there's an <a> inside
      comment_count => $cells->[-1]->text;
    };

    push @users, $user;
});

__DATA__
...
3 голосов
/ 28 февраля 2020

Вы можете сделать это с Mojo :: DOM, перебирая ячейки.

use Mojo::DOM;

my (@usernames, @comment_count);
my $dom = Mojo::DOM->new->parse(do { local $/ = undef; <DATA>});
$dom->find('table.table tr')->each(sub {
    my $cells = $_->find('td');

    push @usernames, $cells->[0]->all_text; # because there's an <a> inside
    push @comment_count, $cells->[-1]->text;
});

__DATA__
...

Это создаст эти два массива с вашими примерами данных.

[
    [0] "user8",
    [1] "user9",
    [2] "user11",
    [3] "user1",
    [4] "user2",
    [5] "user3",
    [6] "user4",
    [7] "user5"
]
[
    [0] 0,
    [1] 0,
    [2] 0,
    [3] 23,
    [4] 2,
    [5] 3,
    [6] 4,
    [7] 5
]

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

Я получил это решение, посмотрев на https://mojolicious.org/perldoc/Mojo/DOM для нахождения правильных узлов и https://mojolicious.org/perldoc/Mojo/Collection для проверки того, как повторять результаты. В конечном итоге все парсеры работают одинаково. Если вы понимаете концепцию, лежащую в основе работы с древовидной структурой, на самом деле не имеет значения, какую реализацию вы используете, тогда все просто ищет правильный синтаксис.

...