У меня есть следующий HTML-код. Я хочу преобразовать код HTML ниже:

<div class="company_data__list">

 <div class="company_data__row"><div class="company_data__head">Name</div><div class="company_data__data">ABC Company<br/>Subtitle</div></div>
 <div class="company_data__row"><div class="company_data__head">Capital</div><div class="company_data__data">230000</div></div>
 <div class="company_data__row"><div class="company_data__head">Total</div><div class="company_data__data">103</div></div>

 <div class="company_data__row"><div class="company_data__head">Name</div><div class="company_data__data">XYZ Company<br/>Subtitle</div> 
 <div class="company_data__row"><div class="company_data__head">Total</div><div class="company_data__data">10</div></div>

 <div class="company_data__row"><div class="company_data__head">Name</div><div class="company_data__data">CAT Company<br/>Subtitle</div></div>
 <div class="company_data__row"><div class="company_data__head">Capital</div><div class="company_data__data">430000</div></div>
 <div class="company_data__row"><div class="company_data__head">Total</div><div class="company_data__data">10233</div></div>
 <div class="company_data__row"><div class="company_data__head">URL</div><div class="company_data__data">www.abc.com</div></div>

</div>



В файл Json, который выглядит так:

{ id: '1',
  data:{
    name: 'ABC CAT Company',
    capital: '230000',
    total:'103'
  },
  id:'2',
  data: {
    name: 'XYZ CAT Company',
    total:'10'
  },
  id:'3',
  data: {
    name: 'CAT Company',
    capital: '430000',
    total:'10',
    url:'www.abc.com'
  },


}

Я использую python3, bs4, re (Regular Expression). У меня проблемы с сопоставлением строк заголовка html со строками данных, поскольку у него нет определенного #id для различения.

2
Krishna Rao 29 Окт 2019 в 08:22
Я думаю, вы спрашиваете что-то вроде этого stackoverflow.com/questions/34504050/…
 – 
Adam Strauss
29 Окт 2019 в 08:43
Да, с помощью pip install html2json
 – 
GiovaniSalazar
29 Окт 2019 в 08:59

2 ответа

Приведенный ниже код может вам помочь.

html_text = 'your_html_text'    
splits = re.split('\n\n', html_text)[1:]
output = []
for i, text in enumerate(splits):
    matches = [re.search(r'company_data__head">(\w+).*company_data__data">([\w\s\.]+)', m) for m in text.split('\n')]
    attrs = {}
    for match in matches:
        if match:
            key = match.group(1)
            value = match.group(2)
            attrs[key] = value
    if attrs:
        output.append({'id': i + 1, 'data': attrs})

Выход

[{'id': 1, 'data': {'Name': 'ABC Company', 'Capital': '230000', 'Total': '103'}}, {'id': 2, 'data': {'Name': 'XYZ Company', 'Total': '10'}}, {'id': 3, 'data': {'Name': 'CAT Company', 'Capital': '430000', 'Total': '10233', 'URL': 'www.abc.com'}}]
1
Karmveer Singh 29 Окт 2019 в 09:42
Пожалуйста, дайте мне знать, если это поможет, и подтвердите это как ответ. Благодарить
 – 
Karmveer Singh
29 Окт 2019 в 09:46

Вы можете получить текст из div с помощью class="company_data__row", используя get_text () в красивом супе. Используйте разделитель, например: separator='<>', чтобы вы могли разделить данные, используя этот разделитель позже.

<div class="company_data__list">

 <div class="company_data__row"><div class="company_data__head">Name</div><div class="company_data__data">ABC Company<br/>Subtitle</div></div>  <div class="company_data__row"><div class="company_data__head">Capital</div><div class="company_data__data">230000</div></div>  <div class="company_data__row"><div class="company_data__head">Total</div><div class="company_data__data">103</div></div>

 <div class="company_data__row"><div class="company_data__head">Name</div><div class="company_data__data">XYZ Company<br/>Subtitle</div></div>   <div class="company_data__row"><div class="company_data__head">Total</div><div class="company_data__data">10</div></div>

 <div class="company_data__row"><div class="company_data__head">Name</div><div class="company_data__data">CAT Company<br/>Subtitle</div></div>  <div class="company_data__row"><div class="company_data__head">Capital</div><div class="company_data__data">430000</div></div>  <div class="company_data__row"><div class="company_data__head">Total</div><div class="company_data__data">10233</div></div>  <div class="company_data__row"><div class="company_data__head">URL</div><div class="company_data__data">www.abc.com</div></div>

</div>

код :

from bs4 import BeautifulSoup 
import urllib.request
url = 'yout_html_address.html'                                                             
htmlpage = urllib.request.urlopen(url) 
page = BeautifulSoup(htmlpage, "lxml")

data_dict ={}
id=0

data = page.find_all('div',{'class': 'company_data__row'})
last = len(data)
for i,item in enumerate(data):
    text = item.get_text(separator='<>',strip = True)
    if i < last-1:
        if 'Name' in text:
            if id>0:
                data_dict[id] = details_dict
            id+=1

            details_dict ={}
            details_dict[text.split('<>')[0]] = text.split('<>')[1]
        else:
            details_dict[text.split('<>')[0]] = text.split('<>')[1]
    else:
        data_dict[id] = details_dict
print(data_dict)

вывод :

{
    1:
        {
            'Name': 'ABC Company', 
            'Capital': '230000', 
            'Total': '103'
        }, 
    2: 
        {
            'Name': 'XYZ Company', 
            'Total': '10'
        }, 
    3: 
        {
            'Name': 'CAT Company', 
            'Capital': '430000', 
            'Total': '10233'
        }
}
0
Shijith 29 Окт 2019 в 09:45