从解析的 Beautiful Soup 列表中删除 <br> 标签?

Posted

技术标签:

【中文标题】从解析的 Beautiful Soup 列表中删除 <br> 标签?【英文标题】:Remove <br> tags from a parsed Beautiful Soup list? 【发布时间】:2011-08-20 23:44:31 【问题描述】:

我目前正在进入一个包含所有我想要的行的 for 循环:

page = urllib2.urlopen(pageurl)
soup = BeautifulSoup(page)
tables = soup.find("td", "bodyTd")
for row in tables.findAll('tr'):

此时,我有了我的信息,但是

<br />

标签正在破坏我的输出。

删除这些最干净的方法是什么?

【问题讨论】:

【参考方案1】:

如果您想将&lt;br /&gt; 转换为换行符,请执行以下操作:

def text_with_newlines(elem):
    text = ''
    for e in elem.recursiveChildGenerator():
        if isinstance(e, basestring):
            text += e.strip()
        elif e.name == 'br':
            text += '\n'
    return text

【讨论】:

【参考方案2】:

用空格替换开头的标签 Beautiful soup 也接受 urlopen 对象上的 .read() 所以这应该可以工作 - - -

page = urllib2.urlopen(pageurl)
page_text=page.read()
new_text=re.sub('</br>',' ',page_text)
soup = BeautifulSoup(new_text)
tables = soup.find("td", "bodyTd")
for row in tables.findAll('tr'):
.....

re.sub 将 br 标记替换为空格

【讨论】:

对于 br 属性只需替换 re.sub('+>',' ',page_text) 如果您确定 br 标记始终看起来像 ''>,则改用 page.replace('', ' ') 会更简单、更快捷。否则,正如@minocha 建议的那样,正则表达式可能更合适。见:***.com/a/5668962【参考方案3】:

也许some_string.replace('&lt;br /&gt;','\n') 用换行符替换换行符。

>>> print 'Some data<br />More data<br />'.replace('<br />','\n')
Some data
More data

您可能想查看html5lib 和lxml,它们都非常擅长解析html。 lxml 非常快,而 html5lib 的设计非常健壮。

【讨论】:

如果我在 HTML 中有&lt;br class="fancy-break" /&gt; 怎么办?只是一个想法。 使用re 模块会更有意义。不过这很不寻常。 我只是想知道beautifulsoup 是解析 only 标签还是只解析属性。也许通过管道将其输入 HTML/XML 解析器也可以?但是如果 OP only&lt;br /&gt;,那么一切都很好;)【参考方案4】:
for e in soup.findAll('br'):
    e.extract()

【讨论】:

那么这绝对是正确的选择! 这可行,但它会提取 br 之间的任何文本,因此它不会只删除多余的 br,您将无法将文本与 br 分开,因为它会删除它 在我的例子中,这个解决方案也去掉了 br 标签周围的文字,所以我使用e.replace_with(' ') 将 br 标签替换为空格。

以上是关于从解析的 Beautiful Soup 列表中删除 <br> 标签?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Beautiful Soup 在 python 中解析网页

爬虫之Beautiful Soup

使用Beautiful Soup 4提取特定列表项

python爬虫之解析库Beautiful Soup

python3解析库Beautiful Soup的安装教程详解

python3解析库Beautiful Soup的安装教程详解