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)