Grep и извлечение данных в Perl - PullRequest
3 голосов
/ 22 мая 2010

У меня есть содержимое HTML, хранящееся в переменной.Как извлечь данные, найденные между набором общих тегов на странице?Например, меня интересуют данные (представленные как DATA , хранящиеся между набором тегов, одна строка за другой:

...
<td class="jumlah">*DATA_1*</td>
<td class="ud"><a href="">*DATA_2*</a></td>
...

И затем я хотел бы сохранить отображениеDATA_2 => DATA_1 в хэше

Ответы [ 4 ]

2 голосов
/ 22 мая 2010

Так как это HTML, я думаю, это может сработать для вас?

https://metacpan.org/pod/XML::XPath

XPath - это путь.

0 голосов
/ 22 мая 2010

Поскольку это HTML, вы, вероятно, хотите, чтобы модуль XPath был создан для работы с HTML, HTML :: TreeBuilder :: XPath .

Сначала вам нужно проанализировать вашу строку, используя методы HTML :: TreeBuilder. Предполагая, что содержимое вашей веб-страницы находится в переменной с именем $content, сделайте это следующим образом:

my $tree = HTML::TreeBuilder->new;
$tree->parse_file($file_name);

Теперь вы можете использовать выражения XPath для получения итераторов по интересующим вас узлам. Это первое выражение получает все td узлы, которые находятся в tr в table в body в html элементе:

my $tdNodes = $tree->findnodes('/html/body/table/tr/td');

Наконец, вы можете просто перебрать все узлы в цикле, чтобы найти то, что вы хотите:

foreach my $node ($tdNodes->get_nodelist) {
  my $data = $node->findvalue('.'); // the content of the node
  print "$data\n";
}

См. Документацию HTML :: TreeBuilder для получения дополнительной информации о его методах и документацию NodeSet для использования объекта результата NodeSet. У w3schools есть проходимое руководство по XPath здесь .

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

0 голосов
/ 22 мая 2010

Вы можете попробовать этот модуль: HTML::TreeBuilder::XPath. Док говорит:

Этот модуль добавляет типичные методы XPath в HTML :: TreeBuilder, чтобы упростить запрос документа.

0 голосов
/ 22 мая 2010

Используйте модули синтаксического анализа HTML, как описано в ответах на этот Q - HTML :: TreeBuilder или HTML :: Parser.

Теоретически, вы можете попытаться сделать это с помощью регулярных выражений, но, как отмечалось в ответах на связанный вопрос и в бесчисленном количестве других случаев SO, анализ HTML с помощью RegEx - плохая идея с заглавными буквами - слишком легко ошибиться, слишком трудно выздороветь, и невозможно получить 100% правильно, так как HTML не является обычным языком.

...