我想使用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/

10-11 17:32