2017-01-18 3 views
1

Использование Scrapy, как я могу получить значение переменной Javascript ....Scrapy - получить значение переменной Javascript

Вот мой код ...

<script rel="bmc-data"> 
     var match = 'yes'; 
     var country = 'uk'; 
     var tmData = { 
     "googleExperimentVariation": "1", 
     "pageTitle": "Child Care", 
     "page_type": "claimed", 
     "company_state": "wyostate", 
     "company_city": "mycity" 
        }; 
</script> 

Я хочу, чтобы проверить значение page_type переменная. Если его "утверждал" процесс на странице, или еще двигаться дальше ....

Я уже видел this и this

Я попытался это ...

pattern = r'page_type = "(\w+)",' 
response.xpath('//script[@rel="bmc-data"]').re(pattern) 

но, конечно, это не работает, потому что я думаю, что мое регулярное выражение ошибочно.

ответ

2

я могу предложить использовать js2xml для этого (отказ от ответственности: я написал js2xml)

>>> import scrapy 
>>> import js2xml 
>>> html = '''<script rel="bmc-data"> 
...  var match = 'yes'; 
...  var country = 'uk'; 
...  var tmData = { 
...   "googleExperimentVariation": "1", 
...   "pageTitle": "Child Care", 
...   "page_type": "claimed", 
...   "company_state": "wyostate", 
...   "company_city": "mycity" 
...     }; 
... </script>''' 
>>> selector = scrapy.Selector(text=html) 
>>> selector.xpath('//script/text()').extract_first() 
u'\n  var match = \'yes\';\n  var country = \'uk\';\n  var tmData = {\n  "googleExperimentVariation": "1",\n  "pageTitle": "Child Care",\n  "page_type": "claimed",\n  "company_state": "wyostate",\n  "company_city": "mycity"\n     };\n' 
>>> jscode = selector.xpath('//script/text()').extract_first() 
>>> print(js2xml.pretty_print(jstree)) 
<program> 
    <var name="match"> 
    <string>yes</string> 
    </var> 
    <var name="country"> 
    <string>uk</string> 
    </var> 
    <var name="tmData"> 
    <object> 
     <property name="googleExperimentVariation"> 
     <string>1</string> 
     </property> 
     <property name="pageTitle"> 
     <string>Child Care</string> 
     </property> 
     <property name="page_type"> 
     <string>claimed</string> 
     </property> 
     <property name="company_state"> 
     <string>wyostate</string> 
     </property> 
     <property name="company_city"> 
     <string>mycity</string> 
     </property> 
    </object> 
    </var> 
</program> 

>>> jstree.xpath('//var[@name="tmData"]/object')[0] 
<Element object at 0x7f0b0018f050> 

>>> from pprint import pprint 
>>> data = js2xml.jsonlike.make_dict(jstree.xpath('//var[@name="tmData"]/object')[0]) 
>>> pprint(data) 
{'company_city': 'mycity', 
'company_state': 'wyostate', 
'googleExperimentVariation': '1', 
'pageTitle': 'Child Care', 
'page_type': 'claimed'} 
>>> data['page_type'] 
'claimed' 
>>> 
+0

Спасибо за ваш ответ Paul, Использование библиотеки для этой простой операции кажется немного излишним ... – Slyper

+0

Зависит от прецедента. Лично, если я могу избежать написания регулярного выражения, я предпочитаю. Может быть, вопрос вкуса. –

1

Ваш шаблон регулярного выражения неисправна здесь:

# you are looking for this bit: "page_type": "claimed", 
re.findall('page_type": "(.+)"', html_body) 
# ["claimed"] 

Или в контексте для Scrapy селекторы в вашем случае:

response.xpath('//script[@rel="bmc-data"]').re('page_type": "(.+)"') 

Если вам нужно проанализировать более одной переменной, такой как thi s Я рекомендую ответ, упомянутый Павлом, поскольку регулярное выражение не всегда является таким же надежным, как синтаксический анализ xml.

+0

Спасибо, я получил эту ошибку, когда я попробовал ваше решение ... 'AttributeError: 'function' object не имеет атрибута 'findall'' – Slyper

+0

@PuneetSharma похоже, что у вас есть проблемы с синтаксисом, см. Мое редактирование для конкретного примера для вашего дело. – Granitosaurus

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