在Python中获取script标签内的变量数据或从JS添加的内容
我想从另一个网址获取数据,为此我使用了urllib和Beautiful Soup。我的数据在一个表格标签里面(我通过Firefox控制台找到了这个标签)。但是,当我尝试通过这个表格的ID来获取数据时,结果却是None。我猜这个表格可能是通过一些JavaScript代码动态添加的。
我尝试了两种解析器'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>
但现在我不知道如何获取这些JavaScript变量的数据。
现在我有两个选择,要么获取表格的内容,要么获取这些JavaScript变量,任意一个都能完成我的任务,但不幸的是我不知道该怎么做。所以请告诉我如何解决其中一个问题。
谢谢
2 个回答
4
我想补充一下@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
21
编辑
使用 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"]];