2012-07-21 24 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