Stop People Copying Your Content with only HTML & CSS

Today I came across a website which had disabled copy and highlighting of the text, even when I turned off JavaScript in the browser. Curious, I researched how this was accomplished.

I found that there’s both multiple CSS extensions and a CSS directive which disables a user selecting text on an element. Further, you can disable the right-click menu with an attribute.

First, adding the attribute & value oncontextmenu=”return false” to a page element will disable the right-click menu.

<body oncontextmenu="return false">

The CSS directive user-select: none; will disable highlighting and copying. The directive is well supported in modern browsers, apart from Safari on iOS and desktop.

This example CSS class includes all prefixes (only the two initial prefixes are needed currently) that can be applied:

.nocopy {
 -webkit-touch-callout: none;
 -webkit-user-select: none;
 -khtml-user-select: none;
 -moz-user-select: none;
 -ms-user-select: none;
 user-select: none;

Example usage:

<body class="nocopy">

Prefixes listed against browser usage:

iOS Safari-webkit-touch-callout: none;
Chrome/Safari/Opera-webkit-user-select: none;
Konqueror-khtml-user-select: none;
Firefox-moz-user-select: none;
Internet Explorer/Edge-ms-user-select: none;

I would definitely avoid this on a production website, as it’s incredibly user un-friendly and looks a bit dodgy. After all, your visitors arrive to read / learn from your content. Often that involves taking notes / clippings for use elsewhere.

It’s an interesting option however.

Fix MySQL Tables with myisamchk

At times tables in MySQL can crash and repair with PHPMyAdmin or from within the MySQL Server console won’t work. In these cases, try to repair (recover) the table with myisamchk using these steps:

Go to the database directory with:

cd /var/lib/mysql/[database name]

Run myisamchk with:

myisamchk -r [table name]

Should that fail, use:

myisamchk -r -v -f [table name]

The flags mean:

  • -r = recover
  • -v = verbose
  • -f = force

Screaming Frog Tips & Tricks

This is an aide memoire for myself, but if you have found really useful Screaming Frog tips to get the most out of the tool, please leave a comment or email me at

If I include the tip, you’ll get a link back to your blog or Twitter handle.

Find unlinked mentions

If you have a long list of URLs where your brand or product is mentioned, and you want to find out which pages do or don’t link back to you, this custom filter in Screaming Frog will be useful:

<a [^>]*?href=(“|’)?http(?:s)?://(?:www\.)?YOURSITE\.com[^>]*?>

(updated to better match a link tag)

Go to Configuration and select Custom, then enter   like this:

Regular expression used in Screaming Frog custom filter
Use regex with a custom filter

Check if page is linking to your site

By using “Contains” in the Custom settings, the filter will find if the page is currently linking to your site, though in this version not whether it is nofollowed.

If you have a modified RegEx to check for nofollow links, please do share in comments.

Match anything including New Lines with RegEx

Within Screaming Frog, the expression .* matches everything except new lines and returns, so if the HTML you want to match looks like this:

<div name=”examplediv”>
<span>Extract This Text</span>

That default expression won’t work. However, if you use (?s).* instead, it will work just fine.

Regex for Inclusion or Exclusion must match full URL string

Screaming Frog only reliably matches on the full URL evaluated. This means that this regex won’t work in all cases:


What this would normally do is include or exclude all auction listing pages on that look like:

That regex should match the twelve-digit auction ID number ending the URL. However, a range of these will still be included when crawling. Updating the regex to the following, to evaluate the whole URL, will work:


Extract anchor text from links to a site

This is a bit messy, but if a page is linking to, it will extract the text from ‘’ to the next closing anchor tag </a>.

This may at times capture other HTML tags that wrap the anchor text itself inside the <a> tag, if those tags have spaces before or after as the regex currently does not handle spaces well. You can find these easily by running a =find(“<“, [cell reference]) to locate any tag opening sharp brackets, then clean up manually.


Note that only the first link’s anchor text will be extracted. If the page has more than one link to, you will need to use a script to break up the page source code and iterate through the resulting text strings.

If you have a more sophisticated working example, please share in the comments.

This Screaming Frog tips article is regularly updated

More Screaming Frog tips & tricks will be added over time.

302s in site moves? It’s OK, if you must

In John Mueller’s webmaster hangout on 6 Nov 2015, I noticed a few comments on website moves which are interesting and go against standard recommendations for SEO.

In a site move (new domain name), Google considers 302s and 301s as equivalent.

“It’s not the case that 302s do something magical to block the flow of PageRank” – John Mueller

302s in a sitemove will pass PageRank as the redirects will be seen as a moved domain, not a temporary redirect. I’m assuming the requirement is also that the change of address (site move) is set in Google Search Console under site settings:


How long it takes for the new URLs to show rather than old ones is hard to say. John Mueller says it’s from hours to maybe a day.

“What will probably happen is that for some URLs on your site, it will take a little bit longer, for some it will go a lot faster.”

This is based on how Google crawls a website, indicating that the moved page needs to be recrawled after the change of address setting & redirects are live before the move takes effect.

The full move can take up to half a year, maybe longer.

If a advanced query is used, the indexed pages won’t drop out of the SERPs entirely until the site’s indexed pages are fully recrawled. Conversely, a query will show a fast initial growth in indexed pages, and then a trickle of further URLs added over time.

Note that 301s are recommended by Google in their guidance for site moves.

“Set up server-side redirects (301-redirect directives) from your old URLs to the new ones. The Change of address tool won’t function without it.”

In other words, it’s still best practice to use 301s.

But if you’re not able to use 301 redirects, you can use 302 redirects in site moves without losing PageRank.

Search Bootcamp Ecommerce Ranking Factors Roundtable

On 22 June 2015 I led a roundtable discussion at SEO Bootcamp in London, the discussion covered various eCommerce optimisation issues, and a range of challenges the delegates were currently working on.

eCommerce Roundtable Discussion
eCommerce Roundtable Discussion
“Let’s sit down and talk about unique content, social signals, page titles, content marketing, brand entities, site speed, SSL certificates, image optimisation, re-marketing, XML sitemaps, videos, internal linking, external linking, toxic backlinks, negative SEO, search themes, local search optimisation, Google Now, crawl budget optimisation, keyword research, call tracking, information architecture, merchandising, schema markup, tracking pixels, up & cross-sell tactics, analytics, conversion tracking… feeling overwhelmed by what your ecommerce siteactually needs to perform and make more money? You’re not alone. Centred on Google and Organic Search, this is an intense 60 minute roundtable to cut through the FUD and focus on the activities that bring returns.”

The slides are a summary of a checklist I use to quickly review and prioritise outstanding issues I find with eCommerce websites. The current version of this tool is linked below:

Download the eCommerce Optimisation Checklist
Download the eCommerce Optimisation Checklist

About Search Bootcamp

Search Bootcamp is a full day set of workshops and roundtables allowing SEOs to get together and learn about new developments in search and meet the experts in person. It’s organised by the SEO Monitor team, and you should take a look at their toolset.

Many thanks to my fellow presenters Kelvin Newman(@kelvinnewman), Alexandra Tachalova (@AlexTachalova), Cosmin Negrescu (@ncosmin), Andy Cooney (@Andy_Cooney), Ann Stanley(@AnnStanley), Joe Shervell (@eelselbows), Bastian Grimm (@basgr), and Alec Bertram (@kiwialec) for making it a great event.

And thank you also to Maria, Irina, and Cosmin for inviting me to present.


eCommerce Ranking Factors Slides
eCommerce Optimisation Checklist

Speaking at eComTeam 2015, Brasov, Romania

I’m proud to be invited to run a workshop and speak at the premier eCommerce conference in Romania, eComTeam. For the conference’s 3rd year, it’s doing a 302 redirection to Brasov in central Transylvania rather than staying in Bucharest.

eComTeam 2015 website

There’s a range of fantastic speakers lined up this year, such as Lukasz Zelezny, Violeta Luca, Tamsin Fox-Davies, Alexandru Lapusan, and Judith Lewis. Full line-up here.

On Day 1, I’m presenting the closing slot and will be presenting some thoughts on SEO & eCommerce over the next few years, as well as rounding up some highlights of the day. I’m calling this “What May Come Next – A review of trends & technologies that will impact how we interact with others, use digital media and shop in 2015 to 2020”.

My workshop for Day 2 is eRetail: From average to great in 2015, from the conference programme:

“This year you can rocket your site up the rankings and boost your profits by improving search engine performance and customer appeal. With best practice across content, UX and Search Engine Optimisation, this workshop gives you a comprehensive roadmap to follow. And we’ll also share the worst SEO errors to avoid.”

In the run-up to the conference, I also took part in a Q&A for, the premier business magazine in Romania with the title Expert SEO: Tribul tau este format din 0,1% din piata. Fa-l sa te adore (in English; Expert SEO, Your Tribe Is 0.1% Of The Market. Learn To Love It).

A version in English is published at the Forward3D blog:

SEO Advice for Start-Up Businesses

I will be making materials and slideshows available here and on my Slideshare account once the conference is over.

The presentation slides are below:

Using Google Translate in Your Google Spreadsheets


Google Translate works very well together with Spreadsheets to turn whatever language you don’t read into your own (or English of course). Once you’re acquainted with the functions used, you’ll quickly be able to modify your original text into whichever language you require. With a bit of clever work, you could automate processes, by connecting your sheet with If This Then That (IFTTT). Below I’m providing two examples of applications I’ve found useful.

But first, we’ll review the formulas.

The formulas

Google spreadsheets has two formulas to help you both translate and identify the language of text within a column.

=GOOGLETRANSLATE(text, [source_language],[target_language])

You can also set the [source_language] to auto-detect by using “auto” instead of a source language code, like this:

=GOOGLETRANSLATE(text, “auto”,”en”) to translate these anchor texts into English.

You don’t need to set the target language, as it will default to the language used in the spreadsheet.

The second formula can help you filter by language:


Full list of 2 letter ISO language codes on Wikipedia.

Translating backlink anchor text

In my consulting work, my team and I often come across backlinks in a range of languages and alphabets. Of course, this makes it difficult to evaluate backlink profiles: Is that anchor text a Brand, Compound, Money or Other term in our classification? Rather than just shrug our shoulders and chuck all of these incomprehensible text snippets in either Money or Other, I decided that using Google Spreadsheets to translate the lot would be more helpful.

To ensure that I got a broad selection of non-English anchor texts, I pulled the backlinks for As they’re in mostly Chinese, it came in handy for the example. Removing the unnecessary columns, we are left with this:

Aliexpress backlinks
Backlink examples for

By using the formula =GOOGLETRANSLATE(D8, “auto”, “en”) in the appropriate columns, we’ll end up with a translated text.

GoogleTranslate formula Aliexpress
Translating with auto-detect to English

Copying the formula down the sheet, and waiting a few moments, we end up with results. I also translated the link source page titles to further illustrate how useful these functions are:

Translated Aliexpress results
The anchor texts and page titles translated

In our work, we would now be easily able to classify the anchor texts in the right groupings.

Auto-translating Google Reader replacement

While Google Reader is no more, Spreadsheets can use the ImportFeed formula to import RSS or Atom feeds.

=ImportFeed(URL, [feedQuery | itemQuery], [headers], [numItems]). Formula arguments are the following:

URL is the url of the RSS or ATOM feed.

feedQuery/itemQuery is one of the following query strings: “feed”, “feed title”, “feed author”, “feed description”, “feed url”, “items”, “items author”, “items title”, “items summary”, “items url”, or “items created”. The feed queries return feed properties; the feed’s title, the feed’s author, etc. If you want the feed data, do an “items” request.

  1. the “feed” query returns a single row with all of the feed information
  2. the “feed ” query returns a single cell with the requested feed information
  3. the “items” query returns a full table, with all of the item information about each item in the feed
  4. the “items ” query returns a single column with the requested information about each item
  5. using a “feed” query, the numItems parameter isn’t necessary and is replaced by the option headers param
  6. with an “items” query, the numItems parameter is expected as the third parameter, and headers as the fourth
  7. headers – “true” if column headers is desired. This will add an extra row to the top of the output labeling each column of the output

Building the spreadsheet

I decided to grab content from Spin Sucks for this example:

ImportFeed formula example
Pulling in the Spin Sucks RSS feed

ImportFeed Results
The ImportFeed formula output

Now for translating the contents of the feed. I picked Swedish (my birth language) by using the formula =GOOGLETRANSLATE(E4, “auto”, “sv”)

GoogleTranslate to Swedish
Formula to translate source into Swedish

And the results are predictably poor but understandable Swedish:

GoogleTranslate Swedish Results
Translating feed text into Swedish

The above is of course a very basic implementation of the formulas, but gives you a starting point to develop from.

Other useful import queries

IMPORTXML: Imports data from any of various structured data types including XML, HTML, CSV, TSV, and RSS and ATOM XML feeds.

IMPORTRANGE: Imports a range of cells from a specified spreadsheet.

IMPORTHTML: Imports data from a table or list within an HTML page.

IMPORTDATA: Imports data at a given url in .csv (comma-separated value) or .tsv (tab-separated value) format.

BrightonSEO September 2013 Slides

I hope everyone enjoyed BrightonSEO yesterday. Tracking down the slides and videos from conference presentations is always a time-consuming challenge, so I’ve done the hard work for you.

Brighton SEO Logo

If you know of any slides or Twitter handles I’m missing to date, please get in touch on @JackNorell or via email at

If you’re the presenter of any of the below, and you’d like to add a short summary of your presentation, add a link to your blog post about it or to your website, please get in touch as above.

Session 1

Social track

Real-Time Marketing for any Brand

Oliver Snoddy Slides @olisnoddy  

Google+ for Brands

Adriano Accardo Slides @AccardoAdriano  

The Ins & Outs of Testing Social

Covers many tools and ways to test your social media efforts.

Jennifer Sable Lopez Slides @Jennita

International track

International Link Curation

What are the key things in creating links internationally?

Kevin Gibbons Slides @kevgibbo BlueGlass UK

International Social & Link Building

Alessandro’ presentation on “International and Social Link Building” focussed on the untapped potential of international social media markets for UK companies. It also featured Batman, Robin and Bane – what more could you want from a Brighton SEO presentation?

Alessandro Brunelli Slides @Ale_Brunelli

The Other Search Engines

Since Google has the biggest market share in Europe, we tend to only watch their developments. Don’t forget we have other search engines too: how are Blekko, Yandex, Baidu, Sogou and other “foreign” engines developing?

Jan-Willem Bobbink Slides @jbobbink

Networks track

How Do You Trust People and Pages You’ve Never Seen Before

Dixon Jones Slides @Dixon_Jones

Making Sense of Lots of Data

Peter A. Passaro Slides @NousExMachina

Social Signal Processing. An Introduction.

Introduction to Social Signal Processing, the computing domain aimed at modelling analysis and synthesis of nonverbal communication in human-human and human-machine interactions.

Alessandro Vinciarelli Slides / Keynotes @alevincia

Session 2

Creative track

Video Hacks

Phil takes us through tips and tricks on making video work at it’s best for SEO.

Phil Nottingham Slides @PhilNottingham

The Rules of ‘The Game’: 6 Tips for Successful Outreach

Danny Ashton Slides @DannyAshton

Actionable Content Marketing and Strategy

Tony Samios took to the main stage with his presentation on “Actionable Content Marketing and Strategy”, which mixed in-depth, actionable advice with the odd X-Factor audition video. “Ant and Deaf” – quality!

Tony Samios Slides

Linkbuilding That "Seemed Like a Good Idea at the Time"

Paul Madden Slides @PaulDavidMadden

LoMo track

Mobile Strategy for Small Businesses

Bridget Randolph Slides @BridgetRandolph

Design for Mobile… Responsive or Adaptive

Justin Taylor Slides @JustinGraphitas

Managing Local Listings

Local Search requires consistent branch level information listed in multiple local listing sites to work effectively. David Whatley from MiShop.local discusses how brands can use their network to significantly extend their local search footprint. He also talks about the “NAP Anchor” – where consistent Name Address and Phone Number together provide the unique identifier for local search.

David Whatley Slides @MIShopLocal

Effective Adwords Tactics for Local Businesses

AdWords have come under fire for becoming too expensive for small and local businesses. These advanced PPC tactics help you become competitive again.

Tara West Slides @Koozai_Tara

Technical track

Crawling the Internet for Fun and Profit

Dom Hodgson Slides @Thehodge

How to Crush the Competition by Watching the SERPs

Rob Bucci Slides @STATrob

In-Core Mining of Large Networks

Sebastiano Vigna      

A Crash Course in Natural Language Processing

Oliver Mason Slides @ojmason

Session 3

Onsite track

The Keyword is Dead: Long Live the Keyword

Stefan Hull

Next Gen Measurement in Google Analytics

Dara’s presentation provides a look into the new ‘Universal Analytics’ and other new features of Google Analytics, with some ideas on how to make the most of what they have on offer.

Dara Fitzgerald Slides @darafitzgerald Fresh Egg

On Page Content Marketing

Lisa Myers Slides @LisaDMyers

Ecommerce SEO – Selling Does Not Make You Link Worthy

Tim Grice Slides @Tim_Grice

Links track

Make Your PR Idea a National SEO Success

Keith White Slides @Keith_Marketing

Data and Content Production

Alan Cairns Slides @lancairns

Low Cost Link Building with Juicy, Juicy Data

Stacey Cavanagh Summary & slides @staceycav

The Inhouse and Agency SEO Should be Friends

If you have a client with an experienced Search Manager in place you should be thanking your lucky stars. The inhouse SEO can be your best asset, so don’t make them your worst enemy. PLUS, the hidden dangers of having a client with no in-house expertise.

Max Brockbank Slides @maxormark

Hacks track

Increasing Prices without Losing Sales

Acquiring customers is increasingly difficult. 98% of site visitors won’t buy and our marketing is incredibly ineffective. This has been bugging marketers for decades. Justin Deaville shows how the lessons that direct mail marketers learnt over decades can rapidly boost your conversion rates through testing.

Justin Deaville Slides @justindeaville

More Offline Leads from Online Traffic

We all spend vast sums of money on digital marketing activities that drive traffic to our websites. What can we do to get the right type of traffic, and increase our conversion rate, leads and sales?

Ali White Slides @AlistairWhite

The Magic of APIs

Matt Beswick Writeup & slides @mattbeswick

Facebook Ad Optimisation

Stephen Croome

Session 4 – Lightning Talks

How We Plan Editorial at BBC Sport

Paul Plunkett Slides @paulplunkett66

Tech Holes in Your Reporting

Katrina Gallagher Slides @Digitangle

Schema & You: Making Microdata Sexy

Sam Harries Slides @PurposeGaming

How Five Ski Companies Built Links with Great Content Marketing

Iain Martin Slides @skipedia

7 Minute SEO

James Ray

Multi-channel Technical SEO

Director of Strategy Mike Briggs was on hand to present a seven-minute “lightning” on “Multichannel Technical SEO”, which he described as “Website Structure for Humans, Robots & Profit”.

Michael Briggs Slides @michaelkebriggs

Breaking Down the Silos

Matt Roberts   @linkdex_matt

Still hungry for more BrightonSEO content? Tony Dimmock put up a round up with links to all the presentations and writeups.