如何使用Selenium python刮除:: before元素在网站中的元素

时间:2018-12-07 16:07:59

标签: python selenium testing web-scraping automation

我正在尝试使用硒从该网站上抓取电话号码。我发现该类为“ tel ttel”,但是当我尝试通过find_element_by_xpath抓取网站时。我得到一个空字符串。

我的代码:

wd = webdriver.Chrome(chrome_path)
url = 'https://www.justdial.com/Bangalore/Spardha-Mithra-IAS-KAS-Coaching-Centre-Opposite-Maruthi-Medicals-Vijayanagar/080PXX80-XX80-140120184741-R6P8_BZDET?xid=QmFuZ2Fsb3JlIEJhbmsgRXhhbSBUdXRvcmlhbHM='
wd.get(url)
phone = wd.find_element_by_xpath('//a[@class="tel ttel"]').text
print(phone)

输出:

  

''

电话号码位于此处: Phone-number

电话号码的检查元素是: Inspect Element

2 个答案:

答案 0 :(得分:3)

您不需要硒。在CSS样式指令中包含应用为伪before元素赋予其值的内容的指令:

enter image description here

这里,.icon-之后的2/3个字母字符串,例如acb映射到容纳span内容的before元素。 \9d0之后的值是所示实际值的+1。您可以根据这些值对(并进行调整)来创建字典,以对before类值中每个span处的数字进行解码。

2/3字母字符串如何映射到内容的示例:

enter image description here

我的方法可能有点冗长,因为我对Python不太熟悉,但是逻辑应该很清楚。

import requests
import re
from bs4 import BeautifulSoup
url = 'https://www.justdial.com/Bangalore/Spardha-Mithra-IAS-KAS-Coaching-Centre-Opposite-Maruthi-Medicals-Vijayanagar/080PXX80-XX80-140120184741-R6P8_BZDET?xid=QmFuZ2Fsb3JlIEJhbmsgRXhhbSBUdXRvcmlhbHM='
res  = requests.get(url, headers  = {'User-Agent': 'Mozilla/5.0'})
soup = BeautifulSoup(res.content, 'lxml')

cipherKey = str(soup.select('style[type="text/css"]')[1])
keys = re.findall('-(\w+):before', cipherKey, flags=0)
values = [int(item)-1 for item in re.findall('9d0(\d+)', cipherKey, flags=0)]
cipherDict = dict(zip(keys,values))
cipherDict[list(cipherDict.keys())[list(cipherDict.values()).index(10)]] = '+'
decodeElements = [item['class'][1].replace('icon-','') for item in soup.select('.telCntct span[class*="icon"]')]

telephoneNumber = ''.join([str(cipherDict.get(i)) for i in decodeElements])
print(telephoneNumber)

答案 1 :(得分:1)

您还可以从计算出的样式中获取:before的内容:

chars = driver.execute_script("return [...document.querySelectorAll('.telCntct a.tel span')].map(span => window.getComputedStyle(span,':before').content)")

但是在这种情况下,您会留下奇怪的unicode内容,然后必须将其映射为数字。