【发布时间】:2020-01-13 15:25:07
【问题描述】:
我正在尝试与每个站点上带有联系号码的元素建立联系。我能够创建例程来获取数字,使用可用格式和 regex 提取联系人号码以及以下代码 sn-p 来获取元素
contact_elem = browser.find_elements_by_xpath("//*[contains(text(), '" + phone_num + "')]")
以https://www.cssfirm.com/为例,联系人号码出现在两个位置,顶部页眉和底部页脚
联系电话的元素文字如下:
<h3>CALL US TODAY AT (855) 910-7824</h3> - Footer
<a href="tel:8559107824"> <span>Call Us<br>Today</span> (855) 910-7824</a> - Header
提取的电话号码在打印出来时完美匹配。由于某种原因,未检测到 header 部分的元素。
我尝试搜索元素,甚至在执行其余代码之前从浏览器中删除 页脚元素。 p>
它未被发现的原因是什么?
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
编辑
代码已更新。忘记了一个重要的部分。此外,中间还有睡眠时间,以便为页面加载提供时间。考虑到它微不足道,我没有将它们包括在内以供快速阅读。
【问题讨论】:
-
预期输出是什么?
-
contact_elem 应该是网页中元素的两个实例的列表。请看编辑。 @QHarr
标签: python selenium selenium-webdriver beautifulsoup