Я усвоил сложный способ, которым регулярные выражения не могут адекватно анализировать html, прежде чем находить пост за постом об этом.
Я пытаюсь извлечь непрочитанные сообщения с веб-страницы, которая находится в таблице. Это единственная таблица на запрашиваемой странице, так что эта часть хороша.
Каждая строка представляет собой набор столбцов, касающихся PM. Класс TR информирует о непрочитанном / прочитанном PM. - это то, что меня ловит.
Я пытался использовать HTML :: TableExtract, который почти работал отлично, за исключением того, что я не могу понять, как проверить элемент TR.
Пример структуры таблицы:
<table>
<tr class="header">
<td></td>
<td>Subject</td>
<td>Sender</td>
<td>Date</td>
</tr>
<tr class="unread">
<td>checkbox for multi-edit stuff</td>
<td>Example of an unread PM</td>
<td>Me</td>
<td>Jul 30, 2011</td>
</tr>
<tr class="read">
....
</tr>
</table>
Использование HTML :: TableExtract Я смог получить все, кроме классов непрочитанных / прочитанных.
Вот так:
$t = HTML::TableExtract->new(keep_html);
$t->parse($lwp_data);
foreach $t2 ($t->tables) {
foreach $row ($t2->rows) {
#Can't find a way to search for <tr class="unread". As
#Attribute data is stripped at this point by HTML::TableExtract
#This now shows EVERY PM in the list
print join(',', @$row), "\n";
}
}
Как еще я могу разобрать это и получить только TR с class = "unread"?
Поиски привели к слишком сложным ответам или ответам, которые не вполне решают мою проблему.
Вот самый последний метод, который я использую, чтобы получить то, что я хочу (И он работает, мне просто интересно, как это сделать лучше):
while ($page =~ m/(unreadpm.*?\/tr)/sg) {
$data = $1;
if ($data =~ m(value="(\d+)".*?<a href="(inbox.php\?action=viewconv&id=\d+)">(.*?)</a>\n</strong>\s+</td>\n\s+<td>(.*?)</td>)sg) {
my ($id,$link,$subject,$user) = ($1, $2, $3, $4);
if ($user =~ m(user\.php\?id=\d+">(.*?)</a>)) {
$user = $1;
}
if (grep $_ eq $id, @ids) {
print "Message ID: $id already listed\n"
} else {
print "Emailing - Subject: $subject by $user. ID: $id Link: $link ...";
send_email($subject,$user,$link);
print "done.\n";
push @ids, $id;
}
}
}