<p><strong>编辑</strong></p>
<p>这将使用<a href="https://docs.python.org/2/library/re.html#module-re" rel="noreferrer">re</a>模块来提取数据并将其作为JSON加载:</p>
<pre><code>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']
</code></pre>
<p>问题是脚本标记偏移量是硬编码的,并且没有可靠的方法在页面中定位它。对页面的更改可能会破坏您的代码。</p>
<p><strong>原始答案</strong></p>
<p>您可以从<a href="http://www.nasdaq.com/quotes/nasdaq-100-stocks.aspx?render=download" rel="noreferrer">http://www.nasdaq.com/quotes/nasdaq-100-stocks.aspx?render=download</a>下载同一数据的CSV表示,而不是尝试对数据进行屏幕擦写。</p>
<p>然后使用Python<a href="https://docs.python.org/2/library/csv.html#module-csv" rel="noreferrer">csv</a>模块来解析和处理它。这不仅更方便,而且将是一个更具弹性的解决方案,因为对HTML的任何更改都可能很容易破坏您的屏幕抓取代码。</p>
<p>否则,如果查看实际的HTML,您将发现数据在以下脚本标记中的页面中可用:</p>
<pre><code><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"]];
</code></pre>