我想从我使用 urllib和Beautiful 的另一个url中获取数据,我的数据在表标记中(我已经用火狐控制台计算出来了)。但是,当我尝试使用他的id获取表时,结果是None,那么我猜这个表必须通过一些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>
但现在我不知道如何获得这些js变量的数据。
现在我有两个选项,要么获取表内容,要么得到js变量,其中任何一个都可以完成我的任务,但不幸的是,我不知道如何获得这些内容,所以请告诉我如何解决其中的任何一个问题。
谢谢
【玩转 GPU】有奖征文
精美礼品等你拿!
编辑
这将使用 回复 模块提取数据并以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']
问题是脚本标记偏移量是硬编码的,并且没有可靠的方法在页面中定位它。对页面的更改可能会破坏代码。
原始答案
您可以从 http://www.nasdaq.com/quotes/nasdaq-100-stocks.aspx?render=download 下载相同数据的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"]];
只是为了增加@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")