javascript - 获取 Python 脚本标签内的变量数据或从 js 添加的内容

标签 javascript python web-scraping beautifulsoup urllib2

我想从另一个我正在使用 urllib 和 Beautiful Soup 的 url 获取数据,我的数据在表标签内(我已经使用 Firefox 控制台弄清楚了)。但是当我尝试使用他的 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 变量,其中任何一个都可以完成我的任务但不幸的是我不知道如何获取这些,所以请告诉我如何解决任何一个的问题。

谢谢

最佳答案

编辑

这将使用 re 来解决问题模块提取数据并将其作为 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 csv模块来解析和处理它。这不仅更方便,而且是一种更具弹性的解决方案,因为对 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"]];

关于javascript - 获取 Python 脚本标签内的变量数据或从 js 添加的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24118337/

相关文章:

python - 测试 Flask 响应是否为 JSON

php - 我可以使用 Moodle 'API' 还是必须抓取它

node.js - 如何从 Google Cloud Function(Cheerio、Node.js)发出多个 http 请求

javascript - 带有 ssl 和静态文件服务的 node.js

python - 如何在 python 中使用多处理为变量分配新值

javascript - 向管道 Angular 添加一个字符

python - 有没有办法打印 __init__ 方法中创建的对象的所有参数?

javascript - 单击 div 时显示图像

php - 使用 jQuery resizer 是否比使用 PHP 的 TimThumb 更快?