2015-03-09 7 views
0

Вопрос выглядит так же, как: XPath Get first element of subset, но это, я думаю, немного другое.Первый элемент XPATH

Вот следующий блог: http://www.mademoiselledeco.com/

Я хочу, чтобы получить первое изображение каждого поста. Для этого, я думал о следующем запросе XPATH:

//div[contains(@class,'type-post status-publish')]//img/@src 

Следуя примеру предыдущего поста я упоминалось, я также пытался: //div[contains(@class,'type-post status-publish')](//img/@src)[1]

но говорит

Предупреждение: DOMXPath :: query(): Недопустимое выражение

любая идея?

спасибо

+0

Это '// div [содержит (@ class, 'type-post status-publish')] // img [1]/@ src' не работает? – potame

+0

Нет, к сожалению, его, кажется, занимает весь элемент img каждого сообщения. То, что я пытаюсь сделать, - это получить только первое появление тега img – justberare

ответ

1

Хорошо, я понимаю, после осмотра источника: каждый <img> содержится в <p>, таким образом, img[1] будет соответствовать всем фотографиям, так как они, в контексте параграфа, первые образ.

В этом контексте, я предпочел бы попытаться получить первый абзац, содержащий изображение:

//div[contains(@class,'type-post status-publish')]//p[img][1]/img/@src 

С этим XPath я получаю 9 img/@src.

1
//div[@class='post-content-container']//p[./img][1]/img 

Это не лучшее решение, но я думаю, что это сработает.

//div[@class='post-content-container'] 

Если получить каждый пост

//p[./img][1]/img 

Если получить первый абзац, который содержит изображение. Затем выбирает изображение.

+0

thx! отлично работает – justberare

+0

Рад, что я мог бы помочь. Я считаю, что ответ @potame тоже будет работать. – Helmer

1

Фактически дублированный вопрос, который вы выбрали, не так уж далек. Она имеет объяснение в one of it's answers, который звучит довольно законны:

Оператор [] имеет более высокий приоритет (связывающийся сильнее), чем // аббревиатуры.

Таким образом, на вашем пути стоит аббревиатура //img. Разложим его:

/descendant-or-self::node()/child::img 

Добавление [1] в конце будет выбрать каждый первый Img ребенка (который так же, как другие изложили). Это также является причиной того, что здесь предикат имеет более высокий приоритет.

Abbreviated Syntax section in Xpath 1.0 фактически покрывает это с примечанием:

Примечание: Путь //para[1] местоположение не означает то же самое, как путь /descendant::para[1] местонахождения. Последний выбирает первый элемент-абзац-потомка; первый выбирает всех потомков para элементов, которые являются первыми para детьми их родителей.

То есть: вы не ищете descendant-or-self оси и любые узлы детей в них, но только для первого img элемента в descendant оси:

/descendant::img[1] 

Так выражение XPath в полном объеме:

//div[contains(@class,'type-post status-publish')]/descendant::img[1]/@src 

Результат с примером (10):

src="http://www.mademoiselledeco.com/wp-content/uploads/2015/03/Couleur-FionaLynch-Caroline-St.jpg" 
src="http://www.mademoiselledeco.com/wp-content/uploads/2015/02/2-OF-MO-cascade-lumineuse2-1024x398.jpg" 
src="https://s-media-cache-ak0.pinimg.com/736x/2e/f7/eb/2ef7eb28dc3e6ac9830cf0f1be7defce.jpg" 
src="http://www.mademoiselledeco.com/wp-content/uploads/2015/01/couleur-peinture-flamant-vert-trekking.jpg" 
src="http://www.mademoiselledeco.com/wp-content/uploads/2015/01/Lily-of-the-Valley-Designed-by-Marie-Deroudilhe-02.jpg" 
src="http://www.mademoiselledeco.com/wp-content/uploads/2015/01/shopping-decoration-jaune-bleu-delamaison-1024x866.jpg" 
src="http://www.mademoiselledeco.com/wp-content/uploads/2015/01/wikao-cheminee-berlin-mademoiselledeco4.jpg" 
src="http://www.mademoiselledeco.com/wp-content/uploads/2015/01/voeux2015-mademoiselledeco-blog.jpg" 
src="http://www.mademoiselledeco.com/wp-content/uploads/2014/12/suite-novotel-constance-guisset-1.jpg" 
src="http://www.mademoiselledeco.com/wp-content/uploads/2014/12/wish-list-decoration-noel-2014.jpg" 

Надеюсь, это проливает некоторый свет.

Смежные вопросы