2012-07-21 67 views
0

我想在下面的HTML标记TH(file.txt的)匹配:BeautifulSoup的findAll与名称和文本

<TABLE WIDTH="71%" BORDER=0 CELLSPACING=0 CELLPADDING=0> 
<TR VALIGN="BOTTOM"> 
<TH WIDTH="34%" ALIGN="LEFT"><FONT SIZE=1><B>Name<BR> </B></FONT><HR NOSHADE></TH> 
<TH WIDTH="3%"><FONT SIZE=1>&nbsp;</FONT></TH> 
<TH WIDTH="5%" ALIGN="CENTER"><FONT SIZE=1><B>Age</B></FONT><HR NOSHADE></TH> 
<TH WIDTH="3%"><FONT SIZE=1>&nbsp;</FONT></TH> 
<TH WIDTH="55%" ALIGN="CENTER"><FONT SIZE=1><B>Positions</B></FONT><HR NOSHADE></TH> 
</TR> 
<TR BGCOLOR="#CCEEFF" VALIGN="TOP"> 
<TD WIDTH="34%"><FONT SIZE=2>Stephen A. Wynn</FONT></TD> 
<TD WIDTH="3%"><FONT SIZE=2>&nbsp;</FONT></TD> 
<TD WIDTH="5%" ALIGN="CENTER"><FONT SIZE=2>60</FONT></TD> 
<TD WIDTH="3%"><FONT SIZE=2>&nbsp;</FONT></TD> 
<TD WIDTH="55%"><FONT SIZE=2>Chairman of the Board and Chief Executive Officer</FONT></TD> 
</TR> 
<TR BGCOLOR="White" VALIGN="TOP"> 
<TD WIDTH="34%"><FONT SIZE=2>Kazuo Okada</FONT></TD> 
<TD WIDTH="3%"><FONT SIZE=2>&nbsp;</FONT></TD> 
<TD WIDTH="5%" ALIGN="CENTER"><FONT SIZE=2>60</FONT></TD> 
<TD WIDTH="3%"><FONT SIZE=2>&nbsp;</FONT></TD> 
<TD WIDTH="55%"><FONT SIZE=2>Vice Chairman of the Board</FONT></TD> 
</TR> 
</TABLE> 

我曾尝试以下,但它似乎不工作:

from bs4 import BeautifulSoup 

infile = open("file.txt") 
soup = BeautifulSoup(infile.read()) 
#this works 
soup.findAll('th') 
#this works but isn't particularly useful... 
soup.findAll(text="Age") 
#this is what I really want, but it returns an empty list 
soup.findAll('th', text="Age") 

感谢您的帮助!

回答

3

据我所知,你想得到第一个文字为“Age”的对象。皮肤有很多种方法来处理这只猫,基本上是从找到所有的东西开始。从那里你可以迭代所有的人来找到包含年龄的人。所以下面的代码应该是有用的。

out = [] 
foo = soup.findAll("th") 
for bar in foo: 
    if bar.find(text"Age"): 
     out.append(bar) 
+0

这就是我想要做的事。这似乎是一种合理的方法,但我不清楚为什么上述方法无效。 例如,以下似乎工作: soup.findAll( 'TD',文本= re.compile(R “永利”)) 但这并不: soup.findAll( '日', text = re.compile(r“Age”)) – 2012-07-21 00:40:22

1

附加<HR>元件与BeautifulSoup的字符串处理干扰。

来自BeautifulSoup文档:“虽然文本是用于查找字符串的,但您可以将其与查找标签的参数结合使用,Beautiful Soup将查找其所有与您的文本值匹配的标签。”

您会发现soup.findAll('th')[2].stringnil,而soup.findAll('th')[2].font.stringu"Age"

找到没有改变你的标记所需的头,你必须做一些像什么TimD提示:

out = [] 
headers = soup.findAll("th") 
for header in headers: 
    if header.find(text="Age"): 
     out.append(header) 
+0

感谢您解释其他代码出错的原因 – 2012-07-21 01:17:28