I am trying to get a list of all countries in the webpage https://www.nexmo.com/products/sms. I see the list is displayed in the drop-down. After inspecting the page, I tried the following code but I must be doing something wrong. I would appreciate some help here.
import requests
from bs4 import BeautifulSoup
# collect and parse page
page = requests.get('https://www.nexmo.com/products/sms')
soup = BeautifulSoup(page.text, 'html.parser')
# pull all text from the div
name_list = soup.find(class_ ='dropdown-content')
print(name_list)
This webpage uses JavaScript to render the HTML. You can render it with Selenium. First install Selenium.
sudo pip3 install selenium
Then get a driver https://sites.google.com/a/chromium.org/chromedriver/downloads (Depending upon your OS you may need to specify the location of your driver)
from selenium import webdriver
from bs4 import BeautifulSoupbrowser = webdriver.Chrome()
url = ('https://www.nexmo.com/products/sms')
browser.get(url)
html_source = browser.page_source
browser.quit()
soup = BeautifulSoup(html_source, 'html.parser')
for name_list in soup.find_all(class_ ='dropdown-row'):print(name_list.text)
Outputs:
Afghanistan
Albania
...
Zambia
Zimbabwe
UPDATED
Alternatively use PyQt5:
On Ubuntu
sudo apt-get install python3-pyqt5
sudo apt-get install python3-pyqt5.qtwebengine
Other OS:
pip3 install PyQt5
Then run:
from bs4 import BeautifulSoup
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl
from PyQt5.QtWebEngineWidgets import QWebEngineViewclass Render(QWebEngineView):def __init__(self, url):self.html = Noneself.app = QApplication(sys.argv)QWebEngineView.__init__(self)self.loadFinished.connect(self._loadFinished)self.load(QUrl(url))self.app.exec_()def _loadFinished(self, result):self.page().toHtml(self.callable)def callable(self, data):self.html = dataself.app.quit()url = 'https://www.nexmo.com/products/sms'
html_source = Render(url).html
soup = BeautifulSoup(html_source, 'html.parser')
for name_list in soup.find_all(class_ ='dropdown-row'):print(name_list.text)