如何使用Python查找包含特定文本的特定html行

时间:2018-08-01 19:05:31

标签: html python-3.x search beautifulsoup

我正在浏览HTML以查找存储在一行中的名称/值对。我无法弄清楚如何在漂亮的汤查找命令中指定要搜索的文本。

from bs4 import BeautifulSoup

html = '''\
<tr>
    <td>Project ID:</td>
    <td>
        <span>112120</span></td>
</tr>
'''

soup = BeautifulSoup(html)
for element in soup.find_all("td", text="Project ID:")
    print (element)
    print (element.next_sibiling)

运行此代码时,没有任何结果。

我意识到我可以返回所有“ td”元素并在每个元素中搜索“ Project ID:”,但这似乎是一件繁重的工作,因为我正在搜索的文档包含大量的行和元素。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

与BeautifulSoup中的所有内容一样,您有许多选择。对于值对,我倾向于最多使用zip()函数:

from bs4 import BeautifulSoup

html = '''\
<tr>
    <td>Project ID:</td>
    <td>
        <span>112120</span></td>
</tr>
'''

soup = BeautifulSoup(html, 'lxml')

# option 1
td = soup.select('td')
for name, value in zip(td, td[1:]):
    print(name.text, value.text)

# option 2
td = soup.find(lambda t: t.text.strip()=='Project ID:').parent.select('td')
for name, value in zip(td, td[1:]):
    print(name.text, value.text)

# option 3
td1 = soup.find(lambda t: t.text.strip()=='Project ID:')
td2 = td1.find_next('td')
print(td1.text, td2.text)

每个选项都会打印:

Project ID: 
112120

选项1 查找所有<td>并将其压缩在一起以获得所需的值对。

选项2 查找选项为文本'Project ID:'的标签,找到父(<tr>)并将<td>压缩在一起,就像在选项1中一样。

选项3 查找带有文本“项目ID:”的标签,查找下一个<td>标签并打印两个标签的文本。