如何使用正则表达式按文本查找标签?

时间:2017-01-16 16:28:31

标签: regex python-3.x beautifulsoup

我需要通过部分文本获取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

所以我可以理解为什么它在第二种情况下不起作用,我该怎么做才能使它有效? 感谢

1 个答案:

答案 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())