Разбор HTML-тегов и конечная информация - PullRequest
0 голосов
/ 19 января 2012

ОК. Я пытался разобрать тег

html, который содержит другие теги и текст

, например,

, если у меня был этот HTML (да, я знаю, используя <b> и <i> плохо, но это просто для примера)

<p> <b> 1 </b> Apple <b> 2 </b> <i> Orange </i> <b> 3 </b> Pineapple </p>

Это может сделать что-то вроде этого

1 Apple 2 Оранжевый 3 Ананас

Как получить отношение

{"1": "Apple", "2": "<i> Orange </i>, "3": "Pineapple"}

Я пытался использовать beautifulsoup tag.next, но это не таквместо этого возвращается теги, он останавливается

Я пытался использовать BeautifulSoup tag.find(text = True, recursive = False) не возвращает ничего, кроме \n

Я пытался tags.findAll("b")

for i in b:
    print i.text
    print tags.find(i).text

Я посмотрел парсинговые теги в тегах, и ничего не получилось, если бы подходили некоторые регулярные выражения (звучит как проблема), а некоторые говорили, что это невозможно (не очень полезно)

Я думаю, что мне нужноузнать, как это сделать, это получить HTML между двумя тегами.Я попытался перебрать бит .nextSibling, который в итоге дал мне пространство юникода, поэтому не могу продолжать перебирать.

У кого-нибудь есть опыт с этим?

1 Ответ

1 голос
/ 19 января 2012

Для накопления элементов (тегов и текста) до и после каждого тега <b> в <p>:

#!/usr/bin/env python
from collections import defaultdict
from BeautifulSoup import BeautifulSoup

d = defaultdict(list) # data structure to hold the result
soup = BeautifulSoup(html)
i = 0
for el in soup.p.contents:
    if getattr(el, 'name', None) == 'b':
       i += 1  # switch to next <b> element
    else:
       d[i].append(el)

import pprint
pprint.pprint(dict(d))

Он правильно выражает намерение, но он не так удобен для чтения и эффективен, как мог бы.

выход

{0: [u' '],
 1: [u' Apple '],
 2: [u' ', <i> Orange </i>, u' '],
 3: [u' Pineapple ']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...