2

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 />'s 替换为段落标签)。

在我的源内容是字符串的测试中,我有:

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)

4

1 回答 1

1

正如建议的那样,我发布了我用作解决方案的解决方法:

更新/解决方法:

只是为了节省人们花时间在答案上,我想出了一个解决方法,基本上我意识到我可以在这个过程的后期调整内容,我通过将它转换为一个字符串来做到这一点,read()然后可以执行所有 re.sub 更改字符串中的必需元素。

我想出的小正则表达式是:

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

于 2013-05-25T04:14:41.967 回答