获取包含字符串的行

0 投票
1 回答
5396 浏览
提问于 2025-04-17 02:59

我想从一个文本文件中获取包含特定字符序列的那一行:

我的输入是:

    <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标签的内容,所以我试着用常规的“in”操作符:

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 个回答

3

如果input只是一个字符串,那么for line in input并不是在逐行遍历,而是在逐个字符遍历。所以像'lucas'这样的字符串在一个只有一个字符的字符串中是找不到的,这样tableInput就不会被赋值。逐行遍历的行为只有在对象是文件的时候才会发生。

如果你想要遍历一个字符串的每一行,你需要这样做:

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

既然你有BeautifulSoup这个工具,我觉得用它来读取每一行第一个单元格的值会好得多,而不是依赖那些粗糙且不可靠的字符串搜索。

补充说明:

我该如何获取包含字符串'lucas'的行的表格条目,有什么提示吗?

可以使用td.parent来获取包含的行,使用td.parent.parent来获取包含的表格或,依此类推。

如果你想要获取下一列中的VX,你可以这样写:

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

撰写回答