我正在浏览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:”,但这似乎是一件繁重的工作,因为我正在搜索的文档包含大量的行和元素。
有什么想法吗?
答案 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>
标签并打印两个标签的文本。