2010-11-19 1 views
1

Я попытался создать программу для очистки сети для команд управления компанией. Это очень точный при получении многих вещей, в том числе:Веб-скрещивание описания человека

-names

-JOB названия

Прообразы

-emails

-Qualifications (MD, PhD, т.д.) и суффиксы (II, III, JR.)

Проблема, с которой я сталкиваюсь, - это соскабливание описания человека. Например, на странице Facebook Executive Bios мне бы хотелось, чтобы описание Марка Цукерберга. Тем не менее, при всех различиях в структуре HTML, очень сложно очистить его с точностью до 100%.

Я использую Perl и многие, что, я считаю, продвинутыми, регулярными выражениями. Есть ли лучший способ/инструмент для решения этой проблемы?

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

РЕДАКТИРОВАТЬ: Я понял, что этот вопрос оторвался как просто попытка разобрать эту конкретную страницу, мне нужно что-то достаточно общее, чтобы работать над любыми компаниями «люди-страницы». Я знаю, что 100% -ная точность недостижима, ища что-то, что позволило бы мне получить 50% плюс, поскольку в настоящее время я снижаюсь примерно на 15-20%.

+2

На самом деле, эта страница тривиальна для очистки с помощью любого анализатора HTML. Вся информация содержится в элементах с разными именами классов. Конечно, использование регулярных выражений для синтаксического анализа HTML - это, как правило, проблема с ошибкой и разочарование. Итак, используйте парсер HTML. –

+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

+0

Да, эта страница тривиально согласована, мне нужно что-то достаточно общее, чтобы работайте на любой странице (или не менее 50-60%). Я просто схватил страницу facebook, чтобы показать пример контента, который я собираюсь сделать. – user387049

ответ

4

Использование регулярных выражений для синтаксического анализа HTML, безусловно, будет терпеть неудачу в одно и то же время.

Несколько модулей, которые могли бы помочь с разбора HTML являются:

Если вам нужно больше контроля над парсинга HTML, вы можете использовать HTML::Parser.

Кроме того, было несколько вопросов по parsing HTML using Perl в StackOverflow. Ответы там могут быть полезны.

Образец скребок для Facebook Executive Bios страницы, которая использует LWP::UserAgent для извлечения содержимого страницы и HTML::TreeBuilder для синтаксического анализа:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use LWP::UserAgent; 
use HTML::TreeBuilder; 

binmode STDOUT, ':utf8'; 

my $ua = LWP::UserAgent->new('agent' => 'Mozilla'); 
my $response = $ua->get('http://www.facebook.com/press/info.php?execbios'); 

my $tree = HTML::TreeBuilder->new(); 
if ($response->is_success()) { 
    $tree->parse_content($response->decoded_content()); 
} 
else { 
    die $response->status_line(); 
} 

for my $biosummary_tag ($tree->look_down('class' => 'biosummary')) { 
    my $bioname_tag = $biosummary_tag->look_down('class' => 'bioname' ); 
    my $biotitle_tag = $biosummary_tag->look_down('class' => 'biotitle'); 
    my $biodescription_tag 
     = $biosummary_tag->look_down('class' => 'biodescription'); 

    my $bioname  = $bioname_tag->as_text(); 
    my $biotitle  = $biotitle_tag->as_text(); 
    my $biodescription = $biodescription_tag->as_text(); 

    print "Name:  $bioname\n"; 
    print "Title:  $biotitle\n"; 
    print "Description: $biodescription\n\n"; 
} 
+0

В чем разница между «($ p_tag-> content_list()) [0]" и "$ p_tag-> as_text"? –

+0

sid_com: 'content_list()' возвращает дочерние узлы, тогда как 'as_text()' возвращает текст в дочерних узлах. Очевидно, что 'as_text()' - это метод, который следует использовать в этом случае. Я обновил свой ответ. Спасибо, что заметили. –

+1

WWW :: Mechanize не поможет в анализе содержимого HTML, кроме ссылок и изображений. –

1

Вы никогда не собираются, чтобы получить 100%, или не при помощи современных технологий.

Наиболее надежным способом является разметка источника, но поскольку вы являетесь веб-соскабливанием, у вас этого нет. Вместо регулярного выражения вы можете попробовать несколько более сложных методов обработки естественного языка (NLP). Я не знаю, что доступно для Perl, но Python's NLTK хорош для начала работы. Это набор инструментов, который вы можете выбрать и выбрать, что вам нужно, чтобы извлечь нужную вам информацию, плюс есть несколько хороших книг, в том числе открытая книга O'Reilly Natural Language Processing with Python.

Смежные вопросы