BeautifulSoup找到所有的名称和文字

时间:2012-07-21 00:23:33

标签: python beautifulsoup

我正在尝试匹配以下HTML(file.txt)中的TH标记:

<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")

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

额外的<HR>元素干扰了BeautifulSoup的字符串处理。

来自BeautifulSoup文档:“尽管文本用于查找字符串,但您可以将其与用于查找标记的参数组合在一起,Beautiful Soup将查找其.string与文本值匹配的所有标记。”

您会发现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)