2013-12-13 3 views
3

Я пытаюсь получить scrapy, чтобы разобрать ссылки на странице, чтобы очистить. К сожалению, ссылки на этой странице заключены в функцию JavaScript onclick. Я хотел бы использовать правило SgmlLinkExtractor, чтобы извлечь ссылку для анализа JavaScript и создать URL-адрес для использования с callback = 'parse_item', если это возможно.Как я могу использовать scrapy для разбора ссылок в JS?

Вот пример каждой ссылки с помощью функции JS:

<a onclick="window.open('page.asp?ProductID=3679','productwin','width=700,height=475,scrollbars,resizable,status');" href="#internalpagelink">Link Text</a> 

мне просто нужно ссылку экстрактор для отправки обратного вызова parse_item: http://domain.com/page.asp?ProductID=3679

Как бы я писать правила CrawlSpider делать это?

Если это невозможно, что было бы лучшим способом получить возможность анализировать все страницы, вложенные в этот формат ссылок JavaScript, на определенный набор стартовых страниц?

Спасибо всем.

+1

Просто получите атрибут onclick и проанализируйте его. – aIKid

+0

Да, как говорится в вопросе ** Как ** я бы написал правила CrawlSpider для этого? Как бы выглядело правило для извлечения page.asp?ProductID = 3679 часть функции onClick и возвращает ее как URL-адрес? –

ответ

5

Вы можете использовать параметр SgmlLinkExtractorattrs.

  • ATTRS (список) - список атрибутов, которые следует учитывать при поиске ссылок для извлечения (только для тех тегов, указанных в параметре бирками). По умолчанию ('HREF',)

и process_value параметра из BaseSgmlLinkExtractor:

  • process_value (вызываемым) - функция, которая принимает каждое значение извлекается из тега и атрибутов сканирует и может изменять значение и возвращать новый, или возвращать None, чтобы полностью игнорировать ссылку. Если не задано, значение process_value по умолчанию равно лямбда x: x.

Таким образом, вы бы написать функцию разбора для "OnClick" значений атрибутов:

def process_onclick(value): 
    m = re.search("window.open\('(.+?)'", value) 
    if m: 
     return m.group(1) 

Давайте проверим, что регулярное выражение:

>>> re.search("window.open\('(.+?)'", 
...   "window.open('page.asp?ProductID=3679','productwin','width=700,height=475,scrollbars,resizable,status');" 
...   ).group(1) 
'page.asp?ProductID=3679' 
>>> 

И затем использовать его в Rule с SgmlLinkExtractor

rules=(
    Rule(SgmlLinkExtractor(allow=(), 
          attrs=('onclick',), 
          process_value=process_onclick), 
     callback='parse_item'), 
) 
+0

Спасибо, Пол! Похоже, что я был после. Я никогда не знал, что вы можете использовать и определять такие правила. Потрясающие!! –

+0

Также просто ошибка орфографии в приведенном выше для кого-либо еще. Это должно быть 'attrs =" onclick "' вместо 'attr =" onclick "' –

+0

Хорошо заметили! Спасибо @JnFity. Я исправлю ответ –

0

Возможно, BaseSpider более подходящий, чем CrawlSpider.

Вы могли извлекали ссылку вы хотите сканировать и excapulate его в Request объект, а затем испускают эту Request object, как следующее:

def parse_xxx(self, response): 
    """do some work""" 
    req_objs = [] 
    req_objs.append(Request(SOME_URL, SOME_ARGS)) 
    """Add more `Request` objects""" 
    for req in req_objs: 
     yield req 
Смежные вопросы