使用Beautifulsoup查找单元格数据,如果找到某个单元格值,则打印整行

时间:2015-11-19 23:09:32

标签: python regex beautifulsoup

目前,我有一个如下表:

<tr class="tdc"><td class="myip_tdc"><a href="javascript:showIt('w115');">Account</a><br/><small>client</small></td>
<td class="tdc">Nov, 19 2015 05:18 pm </td>
<td class="tdc"><small><span style="color:green"> Check </span></small></td>
<tr class="tr"><td class="tde" colspan="6">
<div class="divl" id="wtt1266" style="display: block"><table><tr><td style="padding: 5px"><table><tr><td colspan="3"></td></tr><tr><td>
</td><td>

包含字符串的单元格&#34; Check&#34;是我想要寻找的人。我假设它正在寻找确切的字符串,所以也许我需要正则表达式来处理我想要&#34;检查&#34;也算。我还没有到达那里,但如果有人有洞察力提供,我会接受它!

所以,我有以下代码:

soup = BeautifulSoup(nextpage, "lxml") #page is now converted to a BeautifulSoup object
table = soup.find("table", {'class':'tbled'}) #here is our table
tablerow = soup.find("tr", {'class':"tr"}) #here is a single row of that table
tablecell = soup.find("td", {'class':'tdc'})

for line in tablerow:
    if line.find("Check"):
        print "Yay"

print line

所以,问题在于它打印所有细胞(好),但打印&#34; Yay&#34;在每一行之后。我只想要它打印&#34; Yay&#34;单细胞后用&#34;检查&#34;在里面。我认为if语句可以解决这个问题,但我以某种方式搞砸了那个逻辑。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

有多种方法可以解决这个问题。

一个想法是将function as a text argument value传递给find()方法。该函数将剥离元素的文本并将其与Check进行比较。然后,一旦找到元素,我们就可以在树中找到find the parent td元素:

elm = soup.find(text=lambda x: x and x.strip() == "Check")
td = elm.find_parent("td", class_="tdc")

为了扩展@ Nefarii的答案,以下是如何应用有界字的正则表达式:

elm = soup.find(text=re.compile(r"\b[Cc]heck\b"))
td = elm.find_parent("td", class_="tdc")

答案 1 :(得分:0)

如果你想改用正则表达式路线,那就是正则表达式

for line in tablerow:
     match = re.search("\bCheck\b", line)
     if match:
         print "Yay"

这将匹配Check但不匹配

或者如果您不希望它是特定于案例的

for line in tablerow:
     match = re.search("\b.heck\b", line)
     if match:
         print "Yay"

也会有用