Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 抓取javascript生成的链接_Python 2.7_Web Scraping_Scrapy - Fatal编程技术网

Python 2.7 抓取javascript生成的链接

Python 2.7 抓取javascript生成的链接,python-2.7,web-scraping,scrapy,Python 2.7,Web Scraping,Scrapy,我正在使用Scrapy抓取一个网站,我需要抓取的一个链接似乎是由页面中的一小段Javascript代码生成的,如下所示: <!-- var prefix = 'm&#97;&#105;lt&#111;:'; var suffix = ''; var attribs = ''; var path = 'hr' + 'ef' + '='; var addy59933 = 'HR-C&#111;l&#111;gn&#101;' + '&

我正在使用Scrapy抓取一个网站,我需要抓取的一个链接似乎是由页面中的一小段Javascript代码生成的,如下所示:

 <!--
 var prefix = 'm&#97;&#105;lt&#111;:';
 var suffix = '';
 var attribs = '';
 var path = 'hr' + 'ef' + '=';
 var addy59933 = 'HR-C&#111;l&#111;gn&#101;' + '&#64;';
 addy59933 = addy59933 + 'sc&#111;r' + '&#46;' + 'c&#111;m';
 var addy_text59933 = 'Submit your application';
 document.write( '<a ' + path + '\'' + prefix + addy59933 + suffix + '\'' + attribs + '>' );
 document.write( addy_text59933 );
 document.write( '<\/a>' );
 //-->

除非您从浏览器查看页面,否则链接不会显示,但我需要我的爬行器能够以任何方式刮取它。由于代码嵌入到页面中,我想获取链接,然后从那里重新组装链接url,但是文本的格式我不熟悉

有更好的方法吗

编辑:刚刚发现这些是HTML字符实体。我仍然想知道是否有更好的方法来克服这种困惑。

这里有一个解决方案:

然后赋值改变一些变量的值,混合使用字符串和变量。连接变量标识符的
%(identifidername)s
,以及字符串的字符串值

>>> # identifiers are assigned other string values
... assigns = {}
>>> for assign in js.xpath('.//assign'):
...     value = u"".join(['%%(%s)s' % el.text if el.tag=='identifier' else el.text
...                       for el in assign.xpath('./right//*[self::string or self::identifier]')])
...     key = assign.xpath('string(left/identifier)')
...     assigns[key] = value
... 
>>> pprint.pprint(assigns)
{'addy59933': u'%(addy59933)ssc&#111;r&#46;c&#111;m'}
更新变量dict“应用”赋值

>>> # update variables dict with new values
... for key, val in assigns.items():
...    variables[key] = val % variables
... 
>>> pprint.pprint(variables)
{'addy59933': u'HR-C&#111;l&#111;gn&#101;&#64;sc&#111;r&#46;c&#111;m',
 'addy_text59933': u'Submit your application',
 'attribs': u'',
 'path': u'href=',
 'prefix': u'm&#97;&#105;lt&#111;:',
 'suffix': u''}
>>> 
函数参数位于
参数
节点下(XPath
//arguments/*
):

使用Scrapy
选择器

>>> from scrapy.selector import Selector
>>> selector = Selector(text="".join(arguments), type="html")
>>> selector.xpath('.//a/@href').extract()
[u'mailto:HR-Cologne@scor.com']
>>> 

Scrapy不能处理这个案子。您需要smth来运行此js代码并生成链接。一种选择是使用真正的基于浏览器的工具,如。实际上,您可以从spider启动它,获取链接,然后关闭浏览器。但是,我很确定,这会使事情变慢。可能的复制只会对这种特殊的混淆有效,但是,无论如何,这是一个非常好的解决方案!事实上,@alecxe,我希望将Javascript代码的一些简单而基本的解释构建到js2xml中(欢迎贡献!),而XML模式还不是那么令人满意。但是(通过
js2xml.jsonlike.getall()
)获取字符串、对象和数组已经是可能的,而且非常有用。但是,它不会取代Javascript解释器
>>> # update variables dict with new values
... for key, val in assigns.items():
...    variables[key] = val % variables
... 
>>> pprint.pprint(variables)
{'addy59933': u'HR-C&#111;l&#111;gn&#101;&#64;sc&#111;r&#46;c&#111;m',
 'addy_text59933': u'Submit your application',
 'attribs': u'',
 'path': u'href=',
 'prefix': u'm&#97;&#105;lt&#111;:',
 'suffix': u''}
>>> 
>>> # interpret arguments of document.write()
... arguments = [u"".join(['%%(%s)s' % el.text if el.tag=='identifier' else el.text
...                        for el in arg.xpath('./descendant-or-self::*[self::string or self::identifier]')])
...              for arg in js.xpath('.//arguments/*')]
>>> 
>>> pprint.pprint(arguments)
[u"<a %(path)s'%(prefix)s%(addy59933)s%(suffix)s'%(attribs)s>",
 u'%(addy_text59933)s',
 u'</a>']
>>> 
>>> # apply string formatting replacing identifiers
... arguments = [arg % variables for arg in arguments]
>>> 
>>> pprint.pprint(arguments)
[u"<a href='m&#97;&#105;lt&#111;:HR-C&#111;l&#111;gn&#101;&#64;sc&#111;r&#46;c&#111;m'>",
 u'Submit your application',
 u'</a>']
>>> 
>>> import lxml.html
>>> import lxml.etree
>>> 
>>> doc = lxml.html.fromstring("".join(arguments))
>>> print lxml.etree.tostring(doc)
<a href="mailto:HR-Cologne@scor.com">Submit your application</a>
>>> 
>>> from scrapy.selector import Selector
>>> selector = Selector(text="".join(arguments), type="html")
>>> selector.xpath('.//a/@href').extract()
[u'mailto:HR-Cologne@scor.com']
>>>