python - 查找具有特定文本 selenium python 的所有元素

标签 python selenium selenium-webdriver beautifulsoup

我正在尝试连接每个站点上带有联系号码的元素。我能够创建例程来获取号码,使用可用格式和正则表达式提取联系号码以及以下代码片段来获取元素

    contact_elem = browser.find_elements_by_xpath("//*[contains(text(), '" + phone_num + "')]")

考虑 https://www.cssfirm.com/ 的示例,联系号码出现在 2 个位置,顶部页眉底部页脚

联系号码附带的元素文本如下:

    <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

提取的电话号码在打印时完全匹配。由于某种原因,未检测到 header 部分中的元素。

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

未检测到的原因可能是什么?

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

编辑

代码已更新。忘记了一个重要的部分。此外,中间还给出了 sleep 时间,以便为页面加载提供时间。考虑到它很琐碎,我没有将它们包括在内以便快速阅读。

最佳答案

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

    contact_elem2 = browser.find_element_by_partial_link_text(phone_num)

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

关于python - 查找具有特定文本 selenium python 的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57895039/

相关文章:

python - 将索引数组映射到坐标数组

java - Selenium 火 StaleElementReferenceException

dom - Selenium 隐式等待 vs Thread.sleep()

python - Django 1.9 如何在 __init__.py 中导入

python - (初学者)NLP :I am trying to understand how I can categorise words in text to identify all the words related to a topic

python - Selenium Steam 社区市场列表 python

java - 使用 Selenium 选择关系型 highchart SVG 图像

maven - 使用 TestNG 运行 Selenium webdriver 脚本时,未使用 mvn clean install 命令创建测试输出文件夹

python - 比较pandas Df中的每一行值元素并根据比较输入一个字符串

java - 如何测试基于ajax的网站?