<p>我建议使用正则表达式来选择所有“hotel[#]…”行,然后将所有结果添加到字典中。然后,使用字典,输出到CSV文件。以下措施应该有效:</p>
<pre><code>import re
import csv
src_text = your_javascript_text
p = re.compile(r'hotels\[(?P<hotelid>\d+)\].(?P<attr>\w+) = ("|\')(?P<attr_val>.*?)("|\');', re.DOTALL)
hotels = {}
fieldnames = []
for result in [m.groupdict() for m in p.finditer(src_text)]:
if int(result['hotelid']) not in hotels:
hotels[int(result['hotelid'])] = {}
if result['attr'] not in fieldnames:
fieldnames.append(result['attr'])
hotels[int(result['hotelid'])][result['attr']] = result['attr_val']
output = open('hotels.csv','wb')
csv_writer = csv.DictWriter(output, delimiter=',', fieldnames=fieldnames, quoting=csv.QUOTE_ALL)
csv_writer.writerow(dict((f,f) for f in fieldnames))
for hotel in hotels.items():
csv_writer.writerow(hotel[1])
</code></pre>
<p>现在有了一个包含属性的酒店字典,该字典按Javascript中的ID分组,以及输出文件“酒店.csv“(标题行和正确转义)。我确实做过一些事情,比如命名组,其实这是不必要的,但我发现这更像是自我评论。在</p>
<p>需要注意的是,如果同一个组在Javascript中提供了两次,比如hotelPhone,那么最后一个组是唯一存储的组。在</p>
<p>在处理这类问题时,这取决于你和你的判断,你需要多大的宽容和卫生设施。您可能需要修改正则表达式来处理不在提供的小示例中的示例(例如,更改捕获组,将匹配限制为行首的示例,等等);或者转义换行字符,如电话号码中的字符);或者去掉某些文本(如电话号码中的“phone:”)。我们没有办法知道这一点,所以记住这一点。在</p>
<p>干杯!在</p>