Toggle Theme Editor
Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Charcoal

Move PYTHON - JAVA - JQUERY parse rule

Discussion in 'Trao đổi về thuật toán' started by badboy3283, 25/11/16.

  1. badboy3283

    badboy3283 Active Member

    Hi, cuối tuần rồi mình được giao công việc download nội dung 1 trang web về và viết rule để đọc dữ liệu giống như JQUERY, đây là một đoạn code nhỏ để parse chuổi query sang dạng dict PY (map của JAVA), sau đó dùng dict này để search trên node xml, ai rảnh thực hành cách xử lý chuỗi thì chuyển đoạn code này sang JAVA nhé:

    Code:
    print to_query('div#content > ul.menu a')
    
    [[{'attrs': [('id', '=', 'content')], 'name': 'div', 'next': False}, {'attrs': [('class', '~=', 'menu')], 'name': 'ul', 'next': True}, {'attrs': [], 'name': 'a', 'next': False}]]
    Code:
    def _skip_space(off, l, main):
        off += 1
        while off < l:
            if main[off] == ' ':
                off += 1
            break
        return off
    
    def _get_query(off, l, main, exits=[], keep_exits=[]):
        cs = ''
        off += 1
        while off < l:
            c = main[off]
            if c in exits:
                break
            elif c in keep_exits:
                off -= 1
                break
            off += 1
            cs += c
        return (off, cs.strip())
    
    _KEEP_EXITS = ['[', '.', ' ', '#']
    
    def _get_query_rule(name, method, value, attrs):
        attrs.append((name, method, value))
    
    def to_query(query):
        mains = []
        for main in query.split('|'):
            main = main.strip()
            if len(main) > 0:
                subs = []
                off = 0
                l = len(main)
               
                tag = {'name': False, 'next': False, 'attrs': []}
               
                while off < l:
                    c = main[off]
                    if c == '.':
                        s = _get_query(off, l, main, keep_exits=_KEEP_EXITS)
                        _get_query_rule('class', '~=', s[1], tag['attrs'])
                        off = s[0]
                    elif c == '#':
                        s = _get_query(off, l, main, keep_exits=_KEEP_EXITS)
                        _get_query_rule('id', '=', s[1], tag['attrs'])
                        off = s[0]
                    elif c == '[':
                        s = _get_query(off, l, main, exits=[']'])
                        off = s[0]
                        s = s[1]
                        if '=' in s:
                            s = s.split(',')
                            for a in s:
                                a = a.strip()
                                if len(a) > 0:
                                    m = re.match("^(\w+)(\~?\!?\=?)\"?'?([\w\s_-]+)\"?'?$", a, re.IGNORECASE)
                                    if m:
                                        _get_query_rule(m.group(1), m.group(2), m.group(3), tag['attrs'])
                        else:
                            tag['index'] = int(s)
                    elif c == ' ':
                        off = _skip_space(off, l, main)
                        if main[off] == '>':
                            continue
                        if tag['name'] or tag['attrs']:
                            subs.append(tag)
                        tag = {'name': False, 'next':  False, 'attrs': []}
                        continue
                    elif c == '>':
                        off = _skip_space(off, l, main)
                        if tag['name'] or tag['attrs']:
                            subs.append(tag)
                        tag = {'name': False, 'next': True, 'attrs': []}
                        continue
                    else:
                        off -= 1
                        s = _get_query(off, l, main, keep_exits=_KEEP_EXITS)
                        tag['name'] = s[1]
                        off = s[0]
                    off += 1
                   
                if tag['name'] or tag['attrs']:
                    subs.append(tag)
                if subs:
                    mains.append(subs)
        return mains
     
  2. JackV

    JackV Administrator Staff Member

    Chơi cái này đi badboy, nó hỗ trợ sẵn
    jsoup: Java HTML Parser
     

Chia sẻ trang này

Loading...