从解析的 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】:如果您想将<br />
转换为换行符,请执行以下操作:
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('<br />','\n')
用换行符替换换行符。
>>> print 'Some data<br />More data<br />'.replace('<br />','\n')
Some data
More data
您可能想查看html5lib 和lxml,它们都非常擅长解析html。 lxml 非常快,而 html5lib 的设计非常健壮。
【讨论】:
如果我在 HTML 中有<br class="fancy-break" />
怎么办?只是一个想法。
使用re
模块会更有意义。不过这很不寻常。
我只是想知道beautifulsoup
是解析 only 标签还是只解析属性。也许通过管道将其输入 HTML/XML 解析器也可以?但是如果 OP only 有<br />
,那么一切都很好;)【参考方案4】:
for e in soup.findAll('br'):
e.extract()
【讨论】:
那么这绝对是正确的选择! 这可行,但它会提取 br 之间的任何文本,因此它不会只删除多余的 br,您将无法将文本与 br 分开,因为它会删除它 在我的例子中,这个解决方案也去掉了 br 标签周围的文字,所以我使用e.replace_with(' ')
将 br 标签替换为空格。以上是关于从解析的 Beautiful Soup 列表中删除 <br> 标签?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Beautiful Soup 在 python 中解析网页