Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.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
Javascript 获取Python中脚本标记内的变量数据或从js添加的内容_Javascript_Python_Web Scraping_Beautifulsoup_Urllib2 - Fatal编程技术网

Javascript 获取Python中脚本标记内的变量数据或从js添加的内容

Javascript 获取Python中脚本标记内的变量数据或从js添加的内容,javascript,python,web-scraping,beautifulsoup,urllib2,Javascript,Python,Web Scraping,Beautifulsoup,Urllib2,我想从另一个url获取数据,我正在使用urllib和Beautiful Soup,我的数据在表标记中(我已经使用Firefox控制台找到了)。但当我尝试使用他的id获取表时,结果是无,那么我猜这个表必须通过一些js代码动态添加 我已经尝试了所有两种解析器,lxml、html5lib,但仍然无法获得表数据 我还尝试了一件事: web = urllib.urlopen("my url") html = web.read() soup = BeautifulSoup(html, 'lxml') js

我想从另一个url获取数据,我正在使用urllib和Beautiful Soup,我的数据在表标记中(我已经使用Firefox控制台找到了)。但当我尝试使用他的id获取表时,结果是无,那么我猜这个表必须通过一些js代码动态添加

我已经尝试了所有两种解析器,lxml、html5lib,但仍然无法获得表数据

我还尝试了一件事:

web = urllib.urlopen("my url")
html = web.read()
soup = BeautifulSoup(html, 'lxml')
js  = soup.find("script")
ss = js.prettify()
print ss
结果:

<script type="text/javascript">
 myPage = 'ETFs';
        sectionId = 'liQuotes'; //section tab
        breadCrumbId = 'qQuotes'; //page
        is_dartSite = "quotes";
        is_dartZone = "news";
        propVar = "ETFs";
</script>

myPage=‘ETF’;
sectionId=‘Liquetes’//节选项卡
面包屑标='qQuotes'//页
is_dartSite=“quotes”;
是_dartZone=“新闻”;
propVar=“ETF”;
但现在我不知道如何获取这些js变量的数据

现在我有两个选择,要么获取表格内容,要么获取js变量,其中任何一个都可以完成我的任务,但不幸的是,我不知道如何获取这些,所以请告诉我如何获取并解决任何一个问题

谢谢编辑

这将实现使用模块提取数据并将其加载为JSON的技巧:

import urllib
import json
import re
from bs4 import BeautifulSoup

web = urllib.urlopen("http://www.nasdaq.com/quotes/nasdaq-financial-100-stocks.aspx")
soup = BeautifulSoup(web.read(), 'lxml')
data  = soup.find_all("script")[19].string
p = re.compile('var table_body = (.*?);')
m = p.match(data)
stocks = json.loads(m.groups()[0])

>>> for stock in stocks:
...     print stock
... 
[u'ASPS', u'Altisource Portfolio Solutions S.A.', 116.96, 2.2, 1.92, 86635, u'N', u'N']
[u'AGNC', u'American Capital Agency Corp.', 23.76, 0.13, 0.55, 3184303, u'N', u'N']
.
.
.
[u'ZION', u'Zions Bancorporation', 29.79, 0.46, 1.57, 2154017, u'N', u'N']
问题是脚本标记偏移量是硬编码的,并且没有可靠的方法在页面中找到它。对页面的更改可能会破坏您的代码

原始答案

您可以从中下载相同数据的CSV表示,而不是尝试对数据进行屏幕刮取

然后使用Python模块对其进行解析和处理。这不仅更方便,而且是一个更具弹性的解决方案,因为对HTML的任何更改都可能很容易破坏屏幕抓取代码

否则,如果查看实际的HTML,您会发现数据在以下脚本标记的页面中可用:

<script type="text/javascript">var table_body = [["ATVI", "Activision Blizzard, Inc", 20.92, 0.21, 1.01, 6182877,  .1, "N", "N"],
["ADBE", "Adobe Systems Incorporated", 66.91, 1.44, 2.2, 3629837,  .6, "N", "N"],
["AKAM", "Akamai Technologies, Inc.", 57.47, 1.57, 2.81, 2697834,  .3, "N", "N"],
["ALXN", "Alexion Pharmaceuticals, Inc.", 170.2, 0.7, 0.41, 659817,  .1, "N", "N"],
["ALTR", "Altera Corporation", 33.82, -0.06, -0.18, 1928706,  .0, "N", "N"],
["AMZN", "Amazon.com, Inc.", 329.67, 6.1, 1.89, 5246300,  2.5, "N", "N"],
....
["YHOO", "Yahoo! Inc.", 35.92, 0.98, 2.8, 18705720,  .9, "N", "N"]];
var table_body=[“ATVI”,“动视暴雪公司”,20.92,0.21,1.01,6182877,1,“N”,“N”],
[“ADBE”,“Adobe系统公司”,66.91,1.44,2.23629837,6,“N”,“N”],
[“AKAM”、“Akamai Technologies,Inc.”,57.47、1.57、2.81、2697834、.3,“N”、“N”],
[“ALXN”,“亚力兄制药有限公司”,170.2,0.7,0.41659817,1,“N”,“N”],
[“Alter公司”,33.82,-0.06,-0.182928706.0,“N”,“N”],
[“AMZN”,“Amazon.com,Inc.”,329.67,6.1,1.89,5246300,2.5,“N”,“N”],
....
[“雅虎公司”,35.92,0.98,2.8818705720,9,“N”,“N”];

只需添加到@mhawke的答案中,而不是硬编码脚本标记的偏移量,您可以循环遍历所有脚本标记并匹配与您的模式匹配的一个

web = urllib.urlopen("http://www.nasdaq.com/quotes/nasdaq-financial-100-stocks.aspx")
pattern = re.compile('var table_body = (.*?);')

soup = BeautifulSoup(web.read(), "lxml")
scripts = soup.find_all('script')
for script in scripts:
   if(pattern.match(str(script.string))):
       data = pattern.match(script.string)
       stock = json.loads(data.groups()[0])
       print stock

猜测javascript是否正在生成表内容是没有意义的——您需要首先确认这一点。URL是否可公开访问?如果是,是什么?是的,我确认表数据是从js代码生成的,您可以在这里检查。事实上,很抱歉,CSV对于您发布的URL不可用,在这种情况下,您必须从javascript变量中提取它。它看起来是这样的:
var table_body=[[“ASPS”,“Altisource Portfolio Solutions S.A.”,116.96,2.2,1.9286635,“N”,“N”],[“AGNC”,“美国资本机构公司”,23.76,0.13,0.553184303,“N”,“N”]
是的,我知道我必须从该变量中提取数组,这就是为什么我问如何使用Beauty soup从js变量中获取数据的问题,有什么方法可以做到这一点吗?