Python 查找具有特定文本的所有元素

Python 查找具有特定文本的所有元素,python,selenium,selenium-webdriver,beautifulsoup,Python,Selenium,Selenium Webdriver,Beautifulsoup,我正在尝试与每个站点上带有联系人号码的元素进行连接。我能够创建例程来获取号码,用可用的格式提取联系人号码,regex和下面的代码片段来获取元素 contact_elem = browser.find_elements_by_xpath("//*[contains(text(), '" + phone_num + "')]") 考虑到的示例,联系人号码出现在两个位置,顶部页眉和底部页脚 联系人号码随附的要素文本如下: <h3>CALL US TODAY AT (855

我正在尝试与每个站点上带有联系人号码的元素进行连接。我能够创建例程来获取号码,用可用的格式提取联系人号码,regex和下面的代码片段来获取元素

    contact_elem = browser.find_elements_by_xpath("//*[contains(text(), '" + phone_num + "')]")
考虑到的示例,联系人号码出现在两个位置,顶部页眉和底部页脚

联系人号码随附的要素文本如下:

    <h3>CALL US TODAY AT (855) 910-7824</h3> - Footer
    <a href="tel:8559107824"> <span>Call Us<br>Today</span>&nbsp;&nbsp;(855) 910-7824</a> - Header
今天致电(855)910-7824-页脚
-标题
提取的电话号码在打印时完全匹配。由于某些原因,未检测到标题部分中的元素

在执行其余代码之前,我尝试搜索元素,甚至从浏览器中删除页脚元素

为什么它没有被发现

p.S:下面是业余的、未经修改的代码。欢迎提供有效的编辑/建议。相同的代码已经在不同的站点上进行了测试,效果很好

url = 'http://www.cssfirm.com/'
browser.get(url)

parsed = browser.find_element_by_tag_name('html').get_attribute('innerHTML')
s = BeautifulSoup(parsed, 'html.parser')
s = s.decode('utf-8')
phoneNumberRegex = '(\s*(?:\+?(\d{1,4}))?[-. (]*(\d{1,})[-. )]*(\d{3}|[A-Z0-9]+)[-. \/]*(\d{4}|[A-Z0-9]+)[-. \/]?(\d{4}|[A-Z0-9]+)?(?: *x(\d+))?\s*)'
custom_re = ['([0-9]{4,4} )([0-9]{3,3} )([0-9]{4,4})',
             '([0-9]{3,3} )([0-9]{4,4} )([0-9]{4,4})',
             '(\+[0-9]{2,2}-)([0-9]{4,4}-)([0-9]{4,4}-)(0)',
             '(\([0-9]{3,3}\) )([0-9]{3,3}-)([0-9]{4,4})',
             '(\+[0-9]{2,2} )(\(0\)[0-9]{4,4} )([0-9]{4,6})',
             '([0-9]{5,5} )([0-9]{6,6})',
             '(\+[0-9]{2,2}\(0\))([0-9]{4,4} )([0-9]{4,4})',
             '(\+[0-9]{2,2} )([0-9]{3,3} )([0-9]{4,4} )([0-9]{3,3})',
             '([0-9]{3,3}-)([0-9]{3,3}-)([0-9]{4,4})']

phones = []
phones = re.findall(phoneNumberRegex, s)
phone_num_list = ()
phone_num = ''
matched = 0

for phoneHeader in phones:
    #phoneHeader = phoneHeader.decode('utf-8')
    for ph_cnd in phoneHeader:
        for pttrn in custom_re:
            phones = re.findall(pttrn,ph_cnd)
            if(phones):
                phone_num_list = phones
                for x in phone_num_list:
                    phone_num = ''.join(x)
                try:
                    contact_elem = browser.find_element_by_xpath("//*[contains(text(), '" + phone_num + "')]")
                    phone_num_txt = contact_elem.text
                    if(phone_num_txt):
                        matched = 1
                        break
                except NoSuchElementException:
                    pass
                if(matched == 1):
                    break
        if(matched == 1):
            break
    if(matched == 1):
        break

print("Phone number :",phone_num) <-- Perfect output
contact_elem <--empty for header or just the footer element
url='1〕http://www.cssfirm.com/'
browser.get(url)
parsed=browser。通过标记名(“html”)查找元素。获取属性(“innerHTML”)
s=BeautifulSoup(已解析为'html.parser')
s=s.decode('utf-8')
phoneNumberRegex='(\s*(?:\+?(\d{1,4}))?[-.(]*(\d{1,})[-.]*(\d{3}[A-Z0-9]+)[-.\/]*(\d{4}[A-Z0-9]+)[-.\/](\d{4}[A-Z0-9]+))(?:+]
自定义_re=['([0-9]{4,4})([0-9]{3,3})([0-9]{4,4})],
'([0-9]{3,3} )([0-9]{4,4} )([0-9]{4,4})',
'(\+[0-9]{2,2}-)([0-9]{4,4}-)([0-9]{4,4}-)(0)',
'(\([0-9]{3,3}\) )([0-9]{3,3}-)([0-9]{4,4})',
'(\+[0-9]{2,2} )(\(0\)[0-9]{4,4} )([0-9]{4,6})',
'([0-9]{5,5} )([0-9]{6,6})',
'(\+[0-9]{2,2}\(0\))([0-9]{4,4} )([0-9]{4,4})',
'(\+[0-9]{2,2} )([0-9]{3,3} )([0-9]{4,4} )([0-9]{3,3})',
'([0-9]{3,3}-)([0-9]{3,3}-)([0-9]{4,4})']
电话=[]
phones=re.findall(phoneNumberRegex,s)
电话号码列表=()
电话号码=“”
匹配=0
对于手机中的phoneHeader:
#phoneHeader=phoneHeader.decode('utf-8')
对于phoneHeader中的ph_cnd:
对于定制的pttrn:
电话=关于findall(pttrn,PHU cnd)
如有(电话):
电话号码列表=电话
对于电话号码列表中的x:
电话号码=''。加入(x)
尝试:
联系\u elem=browser。通过\u xpath(“/*[contains(text(),“+phone\u num+”)]”查找\u元素
phone_num_txt=contact_elem.text
如果(电话号码):
匹配=1
打破
除无任何例外:
通过
如果(匹配==1):
打破
如果(匹配==1):
打破
如果(匹配==1):
打破

print(“Phone number:,Phone_num)我通过搜索部分链接文本找到了一个临时解决方案,因为该号码也出现在链接上

    contact_elem2 = browser.find_element_by_partial_link_text(phone_num)

但是,这并不能回答为什么在元素中忽略该文本的一般问题。

我通过搜索部分链接文本找到了一个临时解决方案,因为链接上也有数字

    contact_elem2 = browser.find_element_by_partial_link_text(phone_num)

但是,这并不能回答为什么在元素中忽略该文本的一般问题。

预期输出是什么?contact_elem应该是网页中元素的两个实例的列表。请看编辑@Qharr预期的输出是什么?contact_elem应该是网页中元素的两个实例的列表。请看编辑@QHarr