获取包含字符串的行

时间:2011-09-24 08:35:38

标签: python string beautifulsoup

我正在尝试从包含特定字符序列的文本文件中获取一行:

我的意见:

    <tr><td>lucas.vlan77.be</td> <td><span style="color:green;font-weight:bold">V</span></td> <td><span style="color:green;font-weight:bold">V</span></td> <td><span style="color:green;font-weight:bold">V</span></td> </tr>
<tr><td>jeanpierre.vlan77.be</td> <td><span style="color:green;font-weight:bold">V</span></td> <td><span title="Cannot connect to 193.191.187.25:22345." style="color:red;font-weight:bold">X</span></td> <td><span title="No response from DNS at 193.191.187.25." style="color:red;font-weight:bold">X</span></td> </tr>
<tr><td>sofie.vlan77.be</td> <td><span style="color:green;font-weight:bold">V</span></td> <td><span title="Cannot connect to 193.191.187.26:22345." style="color:red;font-weight:bold">X</span></td> <td><span title="No response from DNS at 193.191.187.26." style="color:red;font-weight:bold">X</span></td> </tr>
<tr><td>thomas.vlan77.be</td> <td><span style="color:green;font-weight:bold">V</span></td> <td><span style="color:green;font-weight:bold">V</span></td> <td><span style="color:green;font-weight:bold">V</span></td> </tr>

现在我需要获得包含lucas的行,我尝试使用beautifulsoup,但这并不意味着只获得一行html标签的内容,所以我尝试使用常规运算符:

def soupParserToTable(self,input):
    global header

    soup = self.BeautifulSoup(input)
    header = soup.first('tr')
    tableInput='0'

    for line in input:
        if 'lucas' in line:
            tableInput = line
    print tableInput

然而它一直返回0而不是

<tr><td>lucas.vlan77.be</td> <td><span style="color:green;font-weight:bold">V</span></td> <td><span style="color:green;font-weight:bold">V</span></td> <td><span style="color:green;font-weight:bold">V</span></td> </tr>

1 个答案:

答案 0 :(得分:3)

如果input只是一个字符串,那么for line in input不会迭代行,它会迭代字符。因此,永远不会在单字符字符串中找到'lucas',并且不会分配tableInput。基于行的迭代行为仅在对象是文件时发生。

如果你想循环遍历字符串的每一行,你必须这样做:

for line in input.split('\n'):
    ...

由于你有BeautifulSoup可用,我会说用 来更好地使用它来读取每行中第一个单元格的值,而不是依赖粗糙和脆弱的字符串搜索。

ETA:

  

如何获取包含字符串'lucas'任何提示的行的表条目?

使用td.parent获取包含的行,td.parent.parent以获取包含的表/ tbody,依此类推。

如果您想在下一栏中获得VX,可以说:

tr= soup.find(text= re.compile('lucas')).parent.parent
vorx= tr.findAll('td')[1].find('span').string