2014-08-30 54 views
2

我刚开始使用BeautifulSoup并遇到问题。我成立了一个HTML片段下方,并作出BeautifulSoup对象:BeautifulSoup find和find_all没有按预期工作

html_snippet = '<p class="course"><span class="text84">Ae 100. Research in Aerospace. </span><span class="text85">Units to be arranged in accordance with work accomplished. </span><span class="text83">Open to suitably qualified undergraduates and first-year graduate students under the direction of the staff. Credit is based on the satisfactory completion of a substantive research report, which must be approved by the Ae 100 adviser and by the option representative. </span> </p>' 
subject = BeautifulSoup(html_snippet) 

我曾尝试做一些查找和像下面find_all操作,但所有我得到的是没有一个空列表:

subject.find(text = 'A') 
subject.find(text = 'Research') 
subject.next_element.find('A') 
subject.find_all(text = 'A') 

当我从我的电脑上的html文件创建BeautifulSoup对象之前,find和find_all操作都工作正常。但是,当我通过urllib2在网上阅读网页时拉动html_snippet时,出现问题。

任何人都可以指出问题在哪里?

+0

您没有任何节点的文本完全等于“A”或“Research” - 您的节点的第一个单词为“A”(或以A开头的词,例如:ae),另一个节点的研究... – 2014-08-30 19:25:56

回答

3

传递这样的说法:

import re 
subject.find(text=re.compile('A')) 

text过滤器的默认行为是要匹配的整个身体。传入正则表达式可以让你匹配片段。

编辑:只匹配机构与A开始,你可以使用以下命令:

subject.find(text=re.compile('^A')) 

要匹配包含以A开头的单词只有身体,你可以使用:

subject.find_all(text = re.compile(r'\bA')) 

这是很难更具体地告诉你在找什么,如果我错误地解释了你的问题,请告诉我。

+0

可能想要在那里的词边界(至少我猜这是OP真正想要的) – 2014-08-30 19:29:08

+0

@JonClements我只在他的示例文本中看到'Ae'。也许他打算在身体的一开始就匹配。我会编辑。 – 2014-08-30 19:31:20

+0

可能是最好的 - 这个单词“A”和出现在文本行中的大写字母“A”之间有很大的区别:)无论如何 - 这肯定是正确的答案,所以+1 +1 – 2014-08-30 19:32:32