У меня есть следующий 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 ответа
Приведенный ниже код может вам помочь.
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'}}]
Вы можете получить текст из 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'
}
}
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.