我需要通过部分文本获取HTML标记。我找到了一些解决方案,但它对我来说效果不佳。
from bs4 import BeautifulSoup
import re
soup = BeautifulSoup("""
<table>
<tbody>
<tr>
<td style="width: 100px; height: 20px">
<div style="font-size: 8.7pt">
Арт.:
<span id="ContentPlaceHolder1_ContentPlaceHolder1_DataList2_Label12_0"> 1185A</span>
</div>
<div style="font-size: 12pt; font-weight: bold;">
<span id="ContentPlaceHolder1_ContentPlaceHolder1_DataList2_LoginView3_0_Label12_0">I_CAN_GET_THIS other text</span>
I CAN NOT GET THIS?.
</div>
</td>
</tr>
</tbody>
</table>
""", 'lxml')
print(soup.find('span', text=re.compile('I_CAN_GET_THIS')))
print(soup.find('div', text=re.compile('I_CAN_NOT_GET_THIS')))
>>> <span id="ContentPlaceHolder1_ContentPlaceHolder1_DataList2_LoginView3_0_Label12_0">I_CAN_GET_THIS other text</span>
>>> None
所以我可以理解为什么它在第二种情况下不起作用,我该怎么做才能使它有效? 感谢
答案 0 :(得分:2)
text
参数(现在已重命名为string
但仍受支持)将使用None
元素的.string
attribute是一个以上的孩子:
如果一个标签包含多个东西,那么不清楚.string应该引用什么,所以.string被定义为None
目标div
元素就是这种情况 - 它有一个span
子节点和一个文本节点。
相反,您可以找到文本节点,然后获取它的父节点:
soup.find(text=re.compile('I CAN NOT GET THIS')).parent
或者,使用searching function,您可以使用.get_text()
组合儿童文本:
soup.find(lambda tag: tag.name == 'div' and 'I CAN NOT GET THIS' in tag.get_text())