我想使用Python从一堆包含硬编码数据的javascript文件中将以下所示的数据行提取到一个csv文件中,如下所示:
.... html代码...
hotels [0] = new hotelData();
hotels [0] .hotelName =“ MANHATTAN”;
hotels [0] .hotelPhone =“”;
hotels [0] .hotelSalesPhone =“”;
hotels [0] .hotelPhone ='Phone:888-350-6432';
hotels [0] .hotelStreet =“ 787 11TH AVENUE”;
hotels [0] .hotelCity =“纽约”;
hotels [0] .hotelState =“ NY”;
hotels [0] .hotelZip =“ 10019”;
hotels [0] .hotelId =“ 51543”;
hotels [0] .hotelLat =“ 40.7686” ;;
hotels [0] .hotelLong =“ -73.992645” ;;
hotels [1] = new hotelData();
hotels [1] .hotelName =“ KOEPPEL”;
hotels [1] .hotelPhone =“”;
hotels [1] .hotelSalesPhone =“”;
hotels [1] .hotelPhone ='Phone:718-721-9100';
hotels [1] .hotelStreet =“ 57-01 NORTHERN BLVD。”;
hotels [1] .hotelCity =“ WOODSIDE”;
hotels [1] .hotelState =“ NY”;
hotels [1] .hotelZip =“ 11377”;
hotels [1] .hotelId =“ 51582”;
hotels [1] .hotelLat =“ 40.75362” ;;
hotels [1] .hotelLong =“ -73.90366” ;;
var mykey =“ AlvQ9gNhp7oNuvjhkalD4OWVs_9LvGHg0ZLG9cWwRdAUbsy-ZIW1N9uVSU0V4X-8”;
var map = null;
var pins = null;
var i = null;
var box = new Array();
var currentBox = null;
var mapOptions = {
凭据:mykey,
enableSearchLogo:否,
showMapTypeSelector:否,
enableClickableLogo:否
}
..... html代码.....
因此,所需的csv输出将类似于上述数据的行:
曼哈顿,电话:888-350-6432 ...
KOEPPEL``电话:718-721-9100 ...
我是否应该使用代码生成工具直接解析以上语句以获取数据?哪一种最有效的Python方法将数千个Javascript文件中包含的此类数据转换为csv表格格式?
更新:
理想情况下,我希望该解决方案将JavaScript语句解析为Python对象,然后将其存储到CSV,以最大程度地不受输入脚本代码的排序和格式影响
最佳答案
我建议使用正则表达式来选择所有“ hotel [#]。...”行,然后将所有结果添加到字典中。然后,使用字典将其输出到CSV文件。以下应该工作:
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])
现在,您将拥有一个包含属性的Hotels字典,该字典按JavaScript中的ID分组,并具有输出文件“ hotels.csv”(具有标题行和正确的转义符)。我确实做了诸如命名组之类的事情,但实际上并没有必要,但发现它更具自我评论性。
应当注意,如果两次在Javascript中提供了相同的组,例如hotelPhone,则最后一个是唯一存储的组。
处理此类问题时,将取决于您和您的判断,您需要多少耐受性和卫生条件。您可能需要修改正则表达式以处理示例,而不仅仅是提供的小样本(即,更改捕获组,将匹配项限制为仅一行开始的匹配项,等等);或转义换行符,例如电话号码中的字符);或删除某些文本(例如电话号码中的“电话:”)。我们没有真正的方式知道这一点,因此请记住这一点。
干杯!
关于python - 将硬编码的初始化值转换为CSV,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17321783/