pyspark 使用www.example.com将html转换为jsonrdd.map

h7appiyu  于 2022-12-11  发布在  Spark
关注(0)|答案(2)|浏览(97)

我有html文件,我想在pySpark中解析。
示例:
第一个
但是在我的笔记本输出中,我在列表元素方面有问题。2它们被正确地解析了。

>object
     >AA: 
       >ListPart: 
         ListName: "[{S1={F1=AAA, F2=BBB, F3=CCC}}, {S1={F1=XXX, F2=GGG, F3=BBB}}]"
     >AAA: 
        F1: "Data"

列表元素表示为一个字符串行。
我的函数解析它:

def xmltodict(content,first_tag=''):
   
    #Content from xml File
    content = re.sub('\n', '', content)
    content = re.sub('\r', '', content)
    content = re.sub('>\s+<', '><', content)

    data = unicodedata.normalize('NFKD', content)
    soup = BeautifulSoup(data, 'lxml')

    body = soup.find('body')

    if(first_tag.strip()!=''):
        struct = body.find(first_tag)
    else:
        struct=body

    return parser(struct)

def parser(struct):
    struct_all = struct.findAll(True, recursive=False)

    struct_dict = {}
    for strc in struct_all:
        tag = strc.name
        tag_name_prop = strc.attrs['name']  
    
        if tag == 'struct':
            d = parser(strc)
            el = {tag_name_prop: d}
            struct_dict.update(el)
        elif tag == 'field':
            v = strc.text
            struct_dict[tag_name_prop] = v
        elif tag == 'list':
            l_elem = []
            for child in strc.contents:
                soap_child = BeautifulSoup(str(child), 'lxml').find('body')
                l_elem.append(parser(soap_child))
                el = {tag_name_prop: l_elem}
                struct_dict.update(el)
    
    with open (result.txt,'w') as file:
        file.write(json.dumps(struct_dict))
        
    return struct_dict

txt文件中的结果是我想要接收的:

"A": {   "AA": {
            "AAA": {"F1": "Data"},
             "ListPart": {
                "ListName": [
                    {
                        "S1": {"F1": "AAA",
                            "F2": "BBB",
                            "F3": "CCC" 
                                                       }
                    },
                    {
                        "S1": { "F1": "XXX",
                            "F2": "GGG",
                            "F3": "BBB"
                        }}]
            }}}

但是在我笔记本输出中,我对列表元素有问题。2它们被正确地解析了。

>object
     >AA: 
       >ListPart: 
         ListName: "[{S1={F1=AAA, F2=BBB, F3=CCC}}, {S1={F1=XXX, F2=GGG, F3=BBB}}]"
     >AAA: 
        F1: "Data"

为什么列表表示为一个字符串行?为什么有“=”符号而不是“:“?

kpbpu008

kpbpu0081#

我把这个问题简化为:
第一个
结果我还

>object
    el2: "[{x1=XA}, {x1=XB}]"
    el1: "AAA"

不是那个

>object
   >el2 
     x1:"XA"
     x1:"XB"
    el1: "AAA"
erhoui1w

erhoui1w2#

我终于解决了我的问题。原因是我应该定义schema并使用它。

df_map = spark.createDataFrame(rdd_map,schema)

相关问题