简体   繁体   English

使用python字典解析HTML表数据

[英]Parsing HTML table data using python dictionary

I am getting the html from Jive page in below format 我从Jive页面获取以下格式的HTML

table = <table class="test" style="border: 1px solid #c6c6c6;" width="100%"><thead><tr><th style="background-color: #efefef; width: 13%;">Tag</th><th style="background-color: #efefef; width: 23.7965%;">ID</th><th style="background-color: #efefef; width: 59.2035%;">URL</th></tr></thead><tbody><tr><td style="width: 13%;">3.7.3</td><td style="width: 23.7965%;"><p>12345</p><p>232323</p><p>4343454</p><p>5454554</p></td><td style="width: 59.2035%;"><p><a class="jive-link-external-small" href="http://google.com" rel="nofollow">http://google.com</a></p><p><a class="jive-link-external-small" href="http://test123.com" rel="nofollow">http://test123.com</a></p><p><a class="jive-link-external-small" href="http://www.yahoo.com" rel="nofollow">http://www.yahoo.com</a></p><p><a class="jive-link-external-small" href="http://www.test.com" rel="nofollow">http://www.test.com</a></p></td></tr><tr><td style="width: 13%;">3.7.4</td><td style="width: 23.7965%;"><p>456789</p><p>545454</p><p>5454545</p><p>545454</p></td><td style="width: 59.2035%;"><p><a class="jive-link-external-small" href="http://foo.com" rel="nofollow">http://foo.com</a></p><p><a class="jive-link-external-small" href="http://www.yahoo.com" rel="nofollow">http://www.yahoo.com</a></p><p><a class="jive-link-external-small" href="http://svn.com" rel="nofollow">http://svn.com</a></p><p><a class="jive-link-external-small" href="http://test.com" rel="nofollow">http://test.com</a></p></td></tr></tbody></table>

For Converting HTML to a dictionary I tried below code 为了将HTML转换为字典,我尝试了以下代码

table = ET.XML(s)
rows = iter(table)
headers = [col.text for col in next(rows)]
for row in rows:
    values = [col.text for col in row]
    out = dict(zip(headers, values))

The above approach does not give me expected output as below based on input from command line argument 上面的方法没有基于命令行参数的输入给我以下预期的输出

Tag       ID         URL
3.7.3     121211     http://yahoo.com
          323243     http://url.com  

This can be achieved using Python XML tree. 这可以使用Python XML树来实现。

    data = response.json()
    html_doc = data['content']['text']

def find_version(ver):
    table = ET.XML(html_doc)

    # headers
    ths = [th.text for th in table.findall('.//th')]

    for tr in table.findall('.//tbody/tr'):
        data = []

        # first col
        data.append(tr[0].text)

        # second col
        data.append([x.text for x in tr[1]])

        # third col
        temp = []
        for x in tr[2]:
            if x.tag == 'a':
                temp.append(x.text)
            else:
                temp.append(x[0].text)
        data.append(temp)

        # dictionary to print all the available data using applicable keys
        #out = OrderedDict(zip(ths, data))
        out = OrderedDict(zip(ths, data))
        #print('out:', out)

        if out['Release'] == ver:
            return out

# --- main ---

res = find_version(ver)

if res:
    '''
    for key, val in res.items():
        print(key, '-', val)
    '''
    #print (res.values())
    f = lambda x: x if isinstance(x, list) else [x]

    for tup in zip(*res.items()):
         for a, b, c in zip_longest(*map(f, tup), fillvalue=''):
            print('{:15}{:15}{:15}'.format(a, b, c))
        #for a, b, c in zip_longest(*map(f, tup), fillvalue=''):
            #print('{:15}'.format(b))                
else:
    print ('Version not found')

Will give you the output in expected format 将为您提供预期格式的输出

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM