«TypeError: ожидаемая строка или буфер» при выполнении re.sub на итерации набора результатов красивого супа

content_a — это прекрасный суп-результат (т. е. тип <class 'bs4.element.ResultSet'>), состоящий из значений типа <class 'bs4.element.Tag'>.

Если я напечатаю 'content_a', я получу:

[<div class="class1 class2">Here is the first sentence.
 <br/> <br/> Here is some text "and some more text."
 <br/> <br/> Here is another sentence.
 <br/> Text<br/><span class="class3">Text</span></div>, <div class="class1 class2">Here is the first sentence.
 <br/> <br/> Here is some text "and some more text."
 <br/> <br/> Here is another sentence.
 <br/> Text<br/><span class="class3">Text</span></div>, etc

Так что мне кажется, что это должен быть простой итерируемый список div.

Я хочу заменить <div class="class1 class2"> на <div class="class1 class2"><p> (моя конечная цель - заменить все <br /> тегами абзаца).

В моем тесте, где исходный контент представляет собой строку, у меня есть:

import re
blablabla = ['<div class="class1 class2">', '<div class="class1 class2">']
for _ in blablabla:
    _ = re.sub('(<div class=\"class1 class2\">)', r"\1<p>",_)
    print _

который возвращает, как требуется:

<div class="class1 class2"><p>
<div class="class1 class2"><p>

Я пытаюсь выполнить один и тот же процесс для каждой итерации в content_a с помощью:

import re
for _ in content_a:
    _ = re.sub('(<div class=\"class1 class2\">)', r"\1<p>",_)
    print _

но получаю ошибку:

...in sub
    return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or buffer

Таким образом, единственная разница, которую я могу различить между двумя примерами, заключается в том, что один из них представляет собой красивый набор результатов супа, а другой представляет собой простой список.

Может ли кто-нибудь понять, почему эта ошибка может происходить?

Изменить:

Кто-то указал здесь, что sub требует строки в качестве третьего аргумента, поэтому третий аргумент, который я передаю, является итерируемым значение типа <class 'bs4.element.Tag'>. Так что, возможно, это проблема. Но мне нужно сохранить характер этих значений для последующей модификации, поэтому я не уверен, как действовать в данный момент.

Обновление/обходной путь:

Просто чтобы сэкономить время на ответ, я нашел обходной путь, в основном я понял, что могу настроить содержимое позже в процессе, и я сделал это, преобразовав его в строку с read(), а затем мог выполнить все изменения re.sub на требуемые элементы в строке.

И небольшое регулярное выражение, которое я придумал, было:

string = re.sub('([^\r]*)\r', r'\1</p>\n<p>', string)


person user1063287    schedule 24.05.2013    source источник
comment
Поскольку вы нашли ответ, вы можете опубликовать этот ответ как фактический ответ на свой вопрос, а затем принять его.   -  person Ro Yo Mi    schedule 24.05.2013


Ответы (1)


Как было предложено, я публикую обходной путь, который я использовал в качестве решения:

Обновление/обходной путь:

Просто чтобы сэкономить время на ответ, я нашел обходной путь, в основном я понял, что могу настроить контент позже в процессе, и я сделал это, преобразовав его в строку с read() и затем мог выполнить все изменения re.sub на требуемые элементы в строке.

И небольшое регулярное выражение, которое я придумал, было:

string = re.sub('([^\r]*)\r', r'\1</p>\n<p>', string)

person user1063287    schedule 25.05.2013