BeautifulSoup意想不到的问题

时间:2013-09-17 15:55:48

标签: python beautifulsoup

所以我编写了一些代码来仅提取某些HTML代码的<p>标记内的内容。这是我的代码

soup = BeautifulSoup(my_string, 'html')
no_tags=' '.join(el.string for el in soup.find_all('p', text=True))

它运行的大多数示例都是我想要的,但我注意到在

等示例中
<p>hello, how are you <code>other code</code> my name is joe</p>

它什么都不返回。我想这是因为<p>标签中还有其他标签。所以要明确一点,我希望它返回的是

hello, how are you my name is joe

有人可以帮我解决如何处理这些例子吗?

1 个答案:

答案 0 :(得分:2)

你的猜测是正确的。根据{{​​3}},.string会在有超过1个子项时返回None(在您的示例中就是这种情况)。

现在,您有几个选择。首先是使用BeautifulSoup documentation并递归迭代它,检查每个访问过的子节点上.string的值。

从长远来看,这种方法可能很麻烦。幸运的是,BeautifulSoup 4提供了一种名为.contents的方法,可以让您以一种简单的方式完成您想要的任务。

最后,如果你知道文本很简单并且想要一个简单的解决方案,你也可以使用正则表达式并用空字符串替换所有/<[^>]*>/。但是,您必须知道.strings