diff --git a/gdata/gdata-parser.c b/gdata/gdata-parser.c
index a43c2ecf..68c371ea 100644
--- a/gdata/gdata-parser.c
+++ b/gdata/gdata-parser.c
@@ -633,6 +633,7 @@ gdata_parser_object_from_element_setter (xmlNode *element, const gchar *element_
 {
 	GDataParsable *parsable, *parent_parsable;
 	GDataParserSetterFunc setter;
+	GError *local_error = NULL;
 
 	/* We're lax on the types so that we don't have to do loads of casting when calling the function, which makes the parsing code more legible */
 	setter = (GDataParserSetterFunc) _setter;
@@ -643,9 +644,21 @@ gdata_parser_object_from_element_setter (xmlNode *element, const gchar *element_
 		return FALSE;
 
 	/* Get the object and check for instantiation failure */
-	parsable = _gdata_parsable_new_from_xml_node (object_type, element->doc, element, NULL, error);
+	parsable = _gdata_parsable_new_from_xml_node (object_type, element->doc, element, NULL, &local_error);
 	if (options & P_REQUIRED && parsable == NULL) {
 		/* The error has already been set by _gdata_parsable_new_from_xml_node() */
+		g_warn_if_fail (local_error != NULL);
+		if (local_error)
+			g_propagate_error (error, local_error);
+		*success = FALSE;
+		return TRUE;
+	} else if (options & P_IGNORE_ERROR && parsable == NULL) {
+		g_clear_error (&local_error);
+		*success = TRUE;
+		return TRUE;
+	} else if (local_error) {
+		g_warn_if_fail (parsable == NULL);
+		g_propagate_error (error, local_error);
 		*success = FALSE;
 		return TRUE;
 	}
diff --git a/gdata/gdata-parser.h b/gdata/gdata-parser.h
index bc7a15a7..0eddf13b 100644
--- a/gdata/gdata-parser.h
+++ b/gdata/gdata-parser.h
@@ -57,6 +57,7 @@ gboolean gdata_parser_int64_from_iso8601 (const gchar *date, gint64 *_time);
  * this only applies to gdata_parser_string_from_element()
  * @P_DEFAULT: if the element content is %NULL or empty, return an empty value instead of erroring (this is mutually exclusive with %P_REQUIRED
  * and %P_NON_EMPTY)
+ * @P_IGNORE_ERROR: ignore any error when the parse fails; can be used to skip empty values (this is mutually exclusive with %P_REQUIRED)
  *
  * Parsing options to be passed in a bitwise fashion to gdata_parser_string_from_element() or gdata_parser_object_from_element().
  * Their names aren't namespaced as they aren't public, and brevity is important, since they're used frequently in the parsing code.
@@ -68,7 +69,8 @@ typedef enum {
 	P_NO_DUPES = 1 << 0,
 	P_REQUIRED = 1 << 1,
 	P_NON_EMPTY = 1 << 2,
-	P_DEFAULT = 1 << 3
+	P_DEFAULT = 1 << 3,
+	P_IGNORE_ERROR = 1 << 4
 } GDataParserOptions;
 
 typedef void (*GDataParserSetterFunc) (GDataParsable *parent_parsable, GDataParsable *parsable);
diff --git a/gdata/services/contacts/gdata-contacts-contact.c b/gdata/services/contacts/gdata-contacts-contact.c
index 73208028..070ec780 100644
--- a/gdata/services/contacts/gdata-contacts-contact.c
+++ b/gdata/services/contacts/gdata-contacts-contact.c
@@ -895,7 +895,7 @@ parse_xml (GDataParsable *parsable, xmlDoc *doc, xmlNode *node, gpointer user_da
 		                                             gdata_contacts_contact_add_relation, self, &success, error) == TRUE ||
 		    gdata_parser_object_from_element_setter (node, "event", P_REQUIRED, GDATA_TYPE_GCONTACT_EVENT,
 		                                             gdata_contacts_contact_add_event, self, &success, error) == TRUE ||
-		    gdata_parser_object_from_element_setter (node, "website", P_REQUIRED, GDATA_TYPE_GCONTACT_WEBSITE,
+		    gdata_parser_object_from_element_setter (node, "website", P_IGNORE_ERROR, GDATA_TYPE_GCONTACT_WEBSITE,
 		                                             gdata_contacts_contact_add_website, self, &success, error) == TRUE ||
 		    gdata_parser_object_from_element_setter (node, "calendarLink", P_REQUIRED, GDATA_TYPE_GCONTACT_CALENDAR,
 		                                             gdata_contacts_contact_add_calendar, self, &success, error) == TRUE ||
