Это правила
- Теги HTML будут начинаться с любого из следующих
<p>
,<ol>
или<ul>
. - Содержимое HTML при обнаружении любого из тегов шага 1 будет содержать только следующие теги:
<em>
,<strong>
или<span style="text-decoration:underline">
. - Сопоставьте теги шага два со следующими:
<strong>
будет этот элемент{"bold":True}
в JSON,<em>
будет{"italics":True}
и<span style="text-decoration:underline">
будет{"decoration":"underline"}
- Любой найденный текст будет
{"text": "this is the text"}
в формате JSON.
Допустим, у меня есть приведенный ниже HTML-код: Используя это:
soup = Soup("THIS IS THE WHOLE HTML", "html.parser")
allTags = [tag for tag in soup.find_all(recursive=False)]
Что производит этот массив:
[
<p>The name is not mine it is for the people<span style="text-decoration: underline;"><em><strong>stephen</strong></em></span><em><strong> how can</strong>name </em><strong>good</strong> <em>his name <span style="text-decoration: underline;">moneuet</span>please </em><span style="text-decoration: underline;"><strong>forever</strong></span><em>tomorrow<strong>USA</strong></em></p>,
<p>2</p>,
<p><strong>moment</strong><em>Africa</em> <em>China</em> <span style="text-decoration: underline;">home</span> <em>thomas</em> <strong>nothing</strong></p>,
<ol><li>first item</li><li><em><span style="text-decoration: underline;"><strong>second item</strong></span></em></li></ol>
]
Применяя приведенные выше правила, вы получите следующий результат:
Первый элемент массива будет преобразован в этот JSON:
{
"text": [
"The name is not mine it is for the people",
{"text": "stephen", "decoration": "underline", "bold": True, "italics": True},
{"text": "how can", "bold": True, "italics": True},
{"text": "name", "italics": True},
{"text": "good", "bold": True},
{"text": "his name", "italics": True},
{"text": "moneuet", "decoration": "underline"},
{"text": "please ", "italics": True},
{"text": "forever", "decoration": "underline", "bold":True},
{"text": "tomorrow", "italics": True},
{"text": "USA", "bold": True, "italics": True}
]
}
Второй элемент массива будет преобразован в этот JSON:
{"text": ["2"] }
Третий элемент массива будет преобразован в этот JSON:
{
"text": [
{"text": "moment", "bold": True},
{"text": "Africa", "italics": True},
{"text": "China", "italics": True},
{"text": "home", "decoration": "underline"},
{"text": "thomas", "italics": True},
{"text": "nothing", "bold": True}
]
}
Четвертый элемент массива будет преобразован в этот JSON:
{
"ol": [
"first item",
{"text": "second item", "decoration": "underline", "italics": True, "bold": True}
]
}
Это моя попытка, так что я могу углубиться. Но вопрос в том, как обрабатывать массив arrayOfTextAndStyles
soup = Soup("THIS IS THE WHOLE HTML", "html.parser")
allTags = [tag for tag in soup.find_all(recursive=False)]
for foundTag in allTags:
foundTagStyles = [tag for tag in foundTag.find_all(recursive=True)]
if len(foundTagStyles ) > 0:
if str(foundTag.name) == "p":
arrayOfTextAndStyles = [{"tag": tag.name, "text":
foundTag.find_all(text=True, recursive=False) }] +
[{"tag":tag.name, "text": foundTag.find_all(text=True,
recursive=False) } for tag in foundTag.find_all()]
elif str(foundTag.name) == "ol":
elif str(foundTag .name) == "ul":
{"text": "The name is not mine it is for the people"}
. - person Martijn Pieters   schedule 29.09.2017can
в вашем первом примере? Как на самом деле следует обращаться с<em><strong> how can</strong>name </em>
? Это вложенная структура с текстом на двух уровнях. - person Martijn Pieters   schedule 29.09.2017<em>his name ...
есть пробел, за которым следует дополнительное вложение. - person Martijn Pieters   schedule 29.09.2017