<p>如果可以使用<a href="http://docs.python-requests.org/en/latest/" rel="nofollow">requests</a>和<a href="http://lxml.de/parsing.html" rel="nofollow">lxml</a>模块,这可能就是您想要的。这里呈现的数据结构非常简单,请根据您的需要进行调整。在</p>
<p>首先,从请求的URL获取响应并将结果解析为HTML树:</p>
<pre><code>import requests
from lxml import etree
import json
response = requests.get("http://www.disastercenter.com/crime/uscrime.htm")
tree = etree.HTML(response.text)
</code></pre>
<p>假设您想提取这两个表,那么创建这个XPath并解压缩结果。<code>totals</code>是“犯罪数量”,而{<cd2>}是“每100000人的犯罪率”:</p>
^{pr2}$
<p>提取原始数据(<code>td.find('./')</code>表示第一个子项,不管它有什么标记)并清理字符串(<code>r''</code>python2.x需要原始字符串):</p>
<pre><code>raw_data = []
for tbody in totals, rates:
rows = []
for tr in tbody.getchildren():
row = []
for td in tr.getchildren():
child = td.find('./')
if child is not None and child.tag != 'br':
row.append(child.text.strip(r'\xa0').strip(r'\n').strip())
else:
row.append('')
rows.append(row)
raw_data.append(rows)
</code></pre>
<p>将前两行中的表标题压缩在一起,然后删除多余的行,这在切片表示法中被视为第11和第12步:</p>
<pre><code>data = {}
data['tags'] = [tag0 + tag1 for tag0, tag1 in zip(raw_data[0][0], raw_data[0][1])]
for raw in raw_data:
del raw[::12]
del raw[::11]
</code></pre>
<p>存储其余的原始数据并创建一个JSON文件(<em>可选:</em>使用<code>separators=(',', ':')</code>消除空白):</p>
<pre><code>data['totals'], data['rates'] = raw_data[0], raw_data[1]
with open('data.json', 'w') as f:
json.dump(data, f, separators=(',', ':'))
</code></pre>