Web Scraping
257
Importing the modules for Selenium is slightly tricky. Instead of 
import 
selenium
, you need to run 
from selenium import webdriver
. (The exact reason 
why the 
selenium
module is set up this way is beyond the scope of this book.) 
After that, you can launch the Firefox browser with Selenium. Enter the fol-
lowing into the interactive shell:
>>> from selenium import webdriver
>>> browser = webdriver.Firefox()
>>> type(browser)
<class 'selenium.webdriver.firefox.webdriver.WebDriver'>
>>> browser.get('http://inventwithpython.com')
You’ll notice when 
webdriver.Firefox()
is called, the Firefox web browser 
starts up. Calling 
type()
on the value 
webdriver.Firefox()
reveals it’s of the 
WebDriver
data type. And calling 
browser.get('http://inventwithpython.com')
directs the browser to http://inventwithpython.com/. Your browser should look 
something like Figure 11-7.
Figure 11-7: After calling webdriver.Firefox() and get() in IDLE, the Firefox browser appears.
Finding Elements on the Page
WebDriver
objects have quite a few methods for finding elements on a 
page. They are divided into the 
find_element_*
and 
find_elements_*
methods. 
The 
find_element_*
methods return a single 
WebElement
object, representing 
the first element on the page that matches your query. The 
find_elements_*
methods return a list of 
WebElement_*
objects for every matching element on 
the page.
Table 11-3 shows several examples of 
find_element_*
and 
find_elements_*
methods being called on a 
WebDriver
object that’s stored in the variable 
browser
.
Pdf form save - C# PDF Field Edit Library: insert, delete, update pdf form field in C#.net, ASP.NET, MVC, Ajax, WPF
Online C# Tutorial to Insert, Delete and Update Fields in PDF Document
change font in pdf form field; add text fields to pdf
Pdf form save - VB.NET PDF Field Edit library: insert, delete, update pdf form field in vb.net, ASP.NET, MVC, Ajax, WPF
How to Insert, Delete and Update Fields in PDF Document with VB.NET Demo Code
change font size in pdf form field; change font size pdf form reader
258   
Chapter 11
table 11-3: Selenium’s WebDriver Methods for Finding Elements
method name
WebElement object/list returned
browser.find_element_by_class_name(name)
browser.find_elements_by_class_name(name)
Elements that use the CSS class 
name
browser.find_element_by_css_selector(selector) 
browser.find_elements_by_css_selector(selector)
Elements that match the CSS 
selector
browser.find_element_by_id(id)
browser.find_elements_by_id(id)
Elements with a matching id attri-
bute value
browser.find_element_by_link_text(text)
browser.find_elements_by_link_text(text)
<a> elements that completely 
match the text provided
browser.find_element_by_partial_link_text(text)
browser.find_elements_by_partial_link_text(text)
<a> elements that contain the text 
provided
browser.find_element_by_name(name)
browser.find_elements_by_name(name)
Elements with a matching name 
attribute value
browser.find_element_by_tag_name(name) 
browser.find_elements_by_tag_name(name)
Elements with a matching tag name 
(case insensitive; an <a> element is 
matched by 'a' and 'A')
Except for the 
*_by_tag_name()
methods, the arguments to all the 
methods are case sensitive. If no elements exist on the page that match 
what the method is looking for, the 
selenium
module raises a 
NoSuchElement
exception. If you do not want this exception to crash your program, add 
try
and 
except
statements to your code.
Once you have the 
WebElement
object, you can find out more about it by 
reading the attributes or calling the methods in Table 11-4.
table 11-4: WebElement Attributes and Methods
Attribute or method Description
tag_name
The tag name, such as 'a' for an <a> element
get_attribute(name) The value for the element’s 
name attribute
text
The text within the element, such as 'hello' in <span>hello</span>
clear()
For text field or text area elements, clears the text typed into it
is_displayed()
Returns True if the element is visible; otherwise returns False
is_enabled()
For input elements, returns True if the element is enabled; other-
wise returns False
is_selected()
For checkbox or radio button elements, returns True if the ele-
ment is selected; otherwise returns False
location
A dictionary with keys 'x' and 'y' for the position of the ele-
ment in the page
For example, open a new file editor and enter the following program:
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://inventwithpython.com')
C# PDF File Merge Library: Merge, append PDF files in C#.net, ASP.
Merge Microsoft Office Word, Excel and PowerPoint data to PDF form. Append one PDF file to the end of another and save to a single PDF file.
pdf add signature field; cannot save pdf form in reader
C# PDF Page Extract Library: copy, paste, cut PDF pages in C#.net
to extract single or multiple pages from adobe PDF file and save into a The portable document format, known as PDF document, is a widely-used form of file
create a pdf form to fill out; create a fillable pdf form
Web Scraping
259
try:
elem = browser.find_element_by_class_name('bookcover')
print('Found <%s> element with that class name!' % (elem.tag_name))
except:
print('Was not able to find an element with that name.')
Here we open Firefox and direct it to a URL. On this page, we try to find 
elements with the class name 
'bookcover'
, and if such an element is found, 
we print its tag name using the 
tag_name
attribute. If no such element was 
found, we print a different message.
This program will output the following:
Found <img> element with that class name!
We found an element with the class name 
'bookcover'
and the tag 
name 
'img'
.
Clicking the Page
WebElement
objects returned from the 
find_element_*
and 
find_elements_*
methods have a 
click()
method that simulates a mouse click on that ele-
ment. This method can be used to follow a link, make a selection on a radio 
button, click a Submit button, or trigger whatever else might happen when 
the element is clicked by the mouse. For example, enter the following into the 
interactive shell:
>>> from selenium import webdriver
>>> browser = webdriver.Firefox()
>>> browser.get('http://inventwithpython.com')
>>> linkElem = browser.find_element_by_link_text('Read It Online')
>>> type(linkElem)
<class 'selenium.webdriver.remote.webelement.WebElement'>
>>> linkElem.click()    # follows the "Read It Online" link
This opens Firefox to http://inventwithpython.com/, gets the 
WebElement
object for the 
<a>
element with the text Read It Online, and then simulates 
clicking that 
<a>
element. It’s just like if you clicked the link yourself; the 
browser then follows that link.
Filling Out and Submitting Forms
Sending keystrokes to text fields on a web page is a matter of finding the 
<input>
or 
<textarea>
element for that text field and then calling the 
send_keys()
method. For example, enter the following into the interactive shell:
>>> from selenium import webdriver
>>> browser = webdriver.Firefox()
>>> browser.get('http://gmail.com')
>>> emailElem = browser.find_element_by_id('Email')
>>> emailElem.send_keys('not_my_real_email@gmail.com')
>>> passwordElem = browser.find_element_by_id('Passwd')
VB.NET Image: How to Save Image & Print Image Using VB.NET
printing multi-page document files, like PDF and Word is used to illustrate how to save a sample RE__Test Public Partial Class Form1 Inherits Form Public Sub New
add signature field to pdf; add form fields to pdf
VB.NET PDF Page Delete Library: remove PDF pages in vb.net, ASP.
this RasterEdge XDoc.PDF SDK, you can simply delete a single page from a PDF document using VB.NET or remove any page from a PDF document and save to local
pdf form creation; add form fields to pdf without acrobat
260   
Chapter 11
>>> passwordElem.send_keys('12345')
>>> passwordElem.submit()
As long as Gmail hasn’t changed the 
id
of the Username and Pass-
word text fields since this book was published, the previous code will fill in 
those text fields with the provided text. (You can always use the browser’s 
inspector to verify the 
id
.) Calling the 
submit()
method on any element 
will have the same result as clicking the Submit button for the form that 
element is in. (You could have just as easily called 
emailElem.submit()
, and 
the code would have done the same thing.) 
Sending Special Keys
Selenium has a module for keyboard keys that are impossible to type into a 
string value, which function much like escape characters. These values are 
stored in attributes in the 
selenium.webdriver.common.keys
module. Since that 
is such a long module name, it’s much easier to run 
from selenium.webdriver 
.common.keys import Keys
at the top of your program; if you do, then you can 
simply write 
Keys
anywhere you’d normally have to write  
selenium.webdriver 
.common.keys
. Table 11-5 lists the commonly used 
Keys
variables.
table 11-5: Commonly Used Variables in the selenium.webdriver.common.keys Module
Attributes
meanings
Keys.DOWNKeys.UPKeys.LEFT 
Keys.RIGHT
The keyboard arrow keys
Keys.ENTERKeys.RETURN
The 
enter
and 
return
keys
Keys.HOMEKeys.ENDKeys.PAGE_DOWN
Keys.PAGE_UP
The 
home
end
pagedown
, and 
pageup
keys
Keys.ESCAPEKeys.BACK_SPACE 
Keys.DELETE
The 
esc
backspace
, and 
delete
keys
Keys.F1Keys.F2, ‮ ‮ ‮ , Keys.F12
The F1 to F12 keys at the top of the keyboard
Keys.TAB
The 
tab
key
For example, if the cursor is not currently in a text field, pressing the 
home
and 
end
keys will scroll the browser to the top and bottom of the page, 
respectively. Enter the following into the interactive shell, and notice how 
the 
send_keys()
calls scroll the page:
>>> from selenium import webdriver
>>> from selenium.webdriver.common.keys import Keys
>>> browser = webdriver.Firefox()
>>> browser.get('http://nostarch.com')
>>> htmlElem = browser.find_element_by_tag_name('html')
>>> htmlElem.send_keys(Keys.END)     # scrolls to bottom
>>> htmlElem.send_keys(Keys.HOME)    # scrolls to top
C# PDF Convert to Tiff SDK: Convert PDF to tiff images in C#.net
Description: Convert to DOCX/TIFF with specified zoom value and save it into stream. Parameters: zoomValue, The magnification of the original PDF page size.
change tab order in pdf form; pdf form save
C# Create PDF from Tiff Library to convert tif images to PDF in C#
Description: Convert to PDF and save it on the disk. Parameters: Name, Description, Valid Value. Description: Convert to PDF and save it into stream. Parameters:
change font size in pdf form; add image to pdf form
Web Scraping
261
The 
<html
> tag is the base tag in HTML files: The full content of the 
HTML file is enclosed within the 
<html>
and 
</html>
tags. Calling 
browser 
.find_element_by_tag_name('html')
is a good place to send keys to the general 
web page. This would be useful if, for example, new content is loaded once 
you’ve scrolled to the bottom of the page.
Clicking Browser Buttons
Selenium can simulate clicks on various browser buttons as well through 
the following methods:
browser.back() 
Clicks the Back button.
browser.forward() 
Clicks the Forward button.
browser.refresh() 
Clicks the Refresh/Reload button.
browser.quit() 
Clicks the Close Window button.
More Information on Selenium
Selenium can do much more beyond the functions described here. It can 
modify your browser’s cookies, take screenshots of web pages, and run 
custom JavaScript. To learn more about these features, you can visit the 
Selenium documentation at http://selenium-python.readthedocs.org/.
Summary
Most boring tasks aren’t limited to the files on your computer. Being able 
to programmatically download web pages will extend your programs to the 
Internet. The 
requests
module makes downloading straightforward, and 
with some basic knowledge of HTML concepts and selectors, you can utilize 
the 
BeautifulSoup
module to parse the pages you download.
But to fully automate any web-based tasks, you need direct control of 
your web browser through the 
selenium
module. The 
selenium
module will 
allow you to log in to websites and fill out forms automatically. Since a web 
browser is the most common way to send and receive information over the 
Internet, this is a great ability to have in your programmer toolkit.
Practice Questions
1.  Briefly describe the differences between the 
webbrowser
requests
BeautifulSoup
, and 
selenium
modules.
2.  What type of object is returned by 
requests.get()
? How can you access 
the downloaded content as a string value?
3.  What Requests method checks that the download worked?
4.  How can you get the HTTP status code of a Requests response?
5.  How do you save a Requests response to a file?
C# PDF Convert to Word SDK: Convert PDF to Word library in C#.net
key. Quick to remove watermark and save PDF text, image, table, hyperlink and bookmark to Word without losing format. Powerful components
create a fillable pdf form from a pdf; pdf fillable form creator
C# Create PDF from PowerPoint Library to convert pptx, ppt to PDF
Description: Convert to PDF/TIFF and save it on the disk. Parameters: Description: Convert to PDF/TIFF and save it into stream. Parameters:
convert word doc to pdf with editable fields; change font pdf form
262   
Chapter 11
6.  What is the keyboard shortcut for opening a browser’s developer tools?
7.  How can you view (in the developer tools) the HTML of a specific ele-
ment on a web page?
8.  What is the CSS selector string that would find the element with an 
id
attribute of 
main
?
9.  What is the CSS selector string that would find the elements with a CSS 
class of 
highlight
?
10.  What is the CSS selector string that would find all the 
<div>
elements 
inside another 
<div>
element?
11.  What is the CSS selector string that would find the 
<button>
element 
with a 
value
attribute set to 
favorite
?
12.  Say you have a Beautiful Soup 
Tag
object stored in the variable 
spam
for 
the element 
<div>Hello world!</div>
. How could you get a string 
'Hello 
world!'
from the 
Tag
object?
13.  How would you store all the attributes of a Beautiful Soup 
Tag
object in 
a variable named 
linkElem
?
14.  Running 
import selenium
doesn’t work. How do you properly import the 
selenium
module?
15.  What’s the difference between the 
find_element_*
and 
find_elements_*
methods?
16.  What methods do Selenium’s 
WebElement
objects have for simulating 
mouse clicks and keyboard keys?
17.  You could call 
send_keys(Keys.ENTER)
on the Submit button’s 
WebElement
object, but what is an easier way to submit a form with Selenium?
18.  How can you simulate clicking a browser’s Forward, Back, and Refresh 
buttons with Selenium?
Practice Projects
For practice, write programs to do the following tasks.
Command Line Emailer
Write a program that takes an email address and string of text on the com-
mand line and then, using Selenium, logs into your email account and 
sends an email of the string to the provided address. (You might want to set 
up a separate email account for this program.)
This would be a nice way to add a notification feature to your programs. 
You could also write a similar program to send messages from a Facebook 
or Twitter account.
C# Create PDF from Excel Library to convert xlsx, xls to PDF in C#
Description: Convert to PDF/TIFF and save it on the disk. Parameters: Description: Convert to PDF/TIFF and save it into stream. Parameters:
cannot edit pdf form; adding a text field to a pdf
C# Create PDF from Word Library to convert docx, doc to PDF in C#.
Description: Convert to PDF/TIFF and save it on the disk. Parameters: Description: Convert to PDF/TIFF and save it into stream. Parameters:
add photo to pdf form; pdf forms save
Web Scraping
263
Image Site Downloader
Write a program that goes to a photo-sharing site like Flickr or Imgur, 
searches for a category of photos, and then downloads all the resulting 
images. You could write a program that works with any photo site that has 
a search feature.
2048
2048 is a simple game where you combine tiles by sliding them up, down, 
left, or right with the arrow keys. You can actually get a fairly high score 
by repeatedly sliding in an up, right, down, and left pattern over and over 
again. Write a program that will open the game at https://gabrielecirulli 
.github.io/2048/ and keep sending up, right, down, and left keystrokes to 
automatically play the game.
Link Verification
Write a program that, given the URL of a web page, will attempt to down-
load every linked page on the page. The program should flag any pages 
that have a 404 “Not Found” status code and print them out as broken links.
12
wo r k i n g   w i t h   e x C e l 
SP r e A D S h e e t S
Excel is a popular and powerful spread-
sheet application for Windows. The 
openpyxl
module allows your Python programs to 
read and modify Excel spreadsheet files. For 
example, you might have the boring task of copying 
certain data from one spreadsheet and pasting it into
another one. Or you might have to go through thousands of rows and pick 
out just a handful of them to make small edits based on some criteria. Or 
you might have to look through hundreds of spreadsheets of department 
budgets, searching for any that are in the red. These are exactly the sort of 
boring, mindless spreadsheet tasks that Python can do for you.
Although Excel is proprietary software from Microsoft, there are free 
alternatives that run on Windows, OS X, and Linux. Both LibreOffice Calc 
and OpenOffice Calc work with Excel’s .xlsx file format for spreadsheets, 
which means the 
openpyxl
module can work on spreadsheets from these appli-
cations as well. You can download the software from https://www. libreoffice 
.org/ and http://www.openoffice.org/, respectively. Even if you already have 
266   
Chapter 12
Excel installed on your computer, you may find these programs easier to 
use. The screenshots in this chapter, however, are all from Excel 2010 on 
Windows 7.
excel documents
First, let’s go over some basic definitions: An Excel spreadsheet document 
is called a workbook. A single workbook is saved in a file with the .xlsx exten-
sion. Each workbook can contain multiple sheets (also called worksheets). The 
sheet the user is currently viewing (or last viewed before closing Excel) is 
called the active sheet.
Each sheet has columns (addressed by letters starting at A) and rows 
(addressed by numbers starting at 1). A box at a particular column and row is 
called a cell. Each cell can contain a number or text value. The grid of cells 
with data makes up a sheet.
installing the openpyxl module
Python does not come with OpenPyXL, so you’ll have to install it. Follow 
the instructions for installing third-party modules in Appendix A; the name 
of the module is 
openpyxl
. To test whether it is installed correctly, enter the 
following into the interactive shell:
>>> import openpyxl
If the module was correctly installed, this should produce no error mes-
sages. Remember to import the 
openpyxl
module before running the interac-
tive shell examples in this chapter, or you’ll get a 
NameError: name 'openpyxl' 
is not defined
error.
This book covers version 2.1.4 of OpenPyXL, but new versions are regu-
larly released by the OpenPyXL team. Don’t worry, though: New versions 
should stay backward compatible with the instructions in this book for quite 
some time. If you have a newer version and want to see what additional fea-
tures may be available to you, you can check out the full documentation for 
OpenPyXL at http://openpyxl.readthedocs.org/.
reading excel documents
The examples in this chapter will use a spreadsheet named example.xlsx 
stored in the root folder. You can either create the spreadsheet yourself 
or download it from http://nostarch.com/automatestuff/. Figure 12-1 shows the 
tabs for the three default sheets named Sheet1, Sheet2, and Sheet3 that Excel 
automatically provides for new workbooks. (The number of default sheets 
created may vary between operating systems and spreadsheet programs.)
Documents you may be interested
Documents you may be interested