2014-01-28 3 views
0

Я использовал BeautifulSoup для анализа веб-сайта и хранения содержимого. Именно в таком виде:Извлечение строк, окруженных тегами html из списка?

records = [[[<p>data_1_1</p>], [<p>data_1_2</p>],[], [<li>data_1_3</li>]], 
      [[<p>data_2_1</p>], [<p>data_2_2</p>], [], [<li>data_2_3</li>]]] 

У меня возникают проблемы, делая это:

records = [["data_1_1", "data_1_2", "data_1_3"], 
      ["data_2_1", "data_2_2", "data_2_3"]] 

Я попытался списковый:

text_records = [sum(record, []) for record in records] 

но текст все еще завернутый в <p> или <li> тегов ,

text_records = [item.string for item in sum(record, []) for record in records] 

принимает текст из тегов, но это дает один большой список с одинаковыми значениями, повторяющимися несколько раз.

Я знаю, что в python есть много примеров, и я искал SO, но я не могу найти ничего, чтобы помочь в этой ситуации.

ответ

1

Edit - Это будет работать даже для нескольких элементов:

[sum([v.string for v in [item for item in record if item]], []) for record in records] 

Добавление суммы будет убедиться, что все списки объединяются в один на запись.

Оригинал:

Это должно работать хорошо до тех пор, пока вы будете всегда только внутренние списки одного пункта:

[[item[0].string for item in row if item] for row in records] 

Это будет пройти через каждую запись, чтобы убедиться, что существует запись с оператор if, а затем добавьте первый элемент списка в новую запись в строковый формат.

+0

спасибо, это сработало. почему 'item [0]' хотя? что еще там? –

+1

Добро пожаловать, рад, что это сработало для вас! Дело не в том, что там есть дополнительные элементы, просто это объект списка. Поэтому вам нужно извлечь элемент из списка (даже если есть только один), иначе он будет рассматриваться как отдельный список. – CasualDemon

0

Это будет прекрасно работать (хотя это много для циклов раздражает, любое предложение приветствуется).

records1 = [BeautifulSoup(k).text for i in records for j in i for k in j]

Смежные вопросы