我正在通过HTML查找存储在一行中的名称值对。我不知道如何在漂亮的soup find命令中指定要搜索的文本。
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:”,但这似乎需要做很多工作,因为我搜索的文档有大量的行和元素。
有什么想法吗?
发布于 2018-08-02 04:34:35
与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查找带有文本‘项目ID:’的标签,查找父项(<tr>
)并将<td>
压缩在一起,如选项1所示。
选项3查找带有文本‘项目ID:’的标签,查找下一个<td>
标签并打印这两个标签的文本。
https://stackoverflow.com/questions/51640636
复制相似问题