我正在尝试匹配以下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> </FONT></TH>
<TH WIDTH="5%" ALIGN="CENTER"><FONT SIZE=1><B>Age</B></FONT><HR NOSHADE></TH>
<TH WIDTH="3%"><FONT SIZE=1> </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> </FONT></TD>
<TD WIDTH="5%" ALIGN="CENTER"><FONT SIZE=2>60</FONT></TD>
<TD WIDTH="3%"><FONT SIZE=2> </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> </FONT></TD>
<TD WIDTH="5%" ALIGN="CENTER"><FONT SIZE=2>60</FONT></TD>
<TD WIDTH="3%"><FONT SIZE=2> </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")
感谢您的帮助!
答案 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].string
为nil
,而soup.findAll('th')[2].font.string
为u"Age"
。
要在不更改标记的情况下找到所需的标题,您必须执行TimD建议的操作:
out = []
headers = soup.findAll("th")
for header in headers:
if header.find(text="Age"):
out.append(header)