2012-06-16 4 views
2

команда = hxs.select ('//table[@class="tablehead"/tbody/tr[contains[[email protected], "игрок"]')синтаксис XPath в Scrapy

Структура полотна сайт я чей стол я хочу, чтобы выбрать следующим образом:

<html> 
<body> 
    <table> 
    <tbody> 
    <tr> 
    <td>...</td> 
    <td>...</td> 
     ... 
    </tr> 
    </tbody> 
    </table> 
</body> 
</html> 

поскольку существует несколько таблиц в веб-сайт, я только хочу, чтобы выбрать тот, чей класс определен как «tablehead». Кроме того, для этой таблицы я хочу только выбрать теги, чьи атрибуты класса содержат строку «player». Моя попытка выше выглядит немного пятнистой для начала. Я попробовал запустить искатель, и он говорит, что строка, которую я создал выше, является недопустимой строкой xpath. Любой совет будет приятным.

+0

theres закрывающая скобка отсутствует и насколько я знаю, содержит функцию => содержит (@class, «player») – MonkeyMonkey

+0

возможный дубликат [Почему мой запрос XPath (очистка HTML-таблиц) работает только в Firebug, но не приложение, которое я разрабатываю?] (http://stackoverflow.com/questions/18241029/why-does-my-xpath-query-scraping-html-tables-only-work-in-firebug-but-not -the) –

ответ

2

//table[@class="tablehead"/tbody/tr[contains[[email protected], "игрок"]

исправляющих это приводит к:

//table[@class='tablehead']/tbody/tr[contains(@class, 'player')] 

Это выбирает каждое tr строковое значение, атрибут которого class содержит строку "player" и что (tr) является дочерним по отношению к tbody, являющемуся потомком любого table в документе XML, чей атрибут class имеет строковое значение "tablehead".

XSLT - на основе проверки:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "//table[@class='tablehead'] 
     /tbody/tr[contains(@class, 'player')] 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

Когда это преобразование применяется на прилагаемом документе XML (сделано только немного более реалистичным):

<html> 
    <body> 
     <table class="tablehead"> 
      <tbody> 
       <tr class="major-player"> 
        <td>player1</td> 
        <td>player2</td> 
       </tr> 
      </tbody> 
     </table> 
    </body> 
</html> 

в Xpath выражение, и выбранные узлы (только один в этом случае) копируются на выход:

<tr class="major-player"> 
    <td>player1</td> 
    <td>player2</td> 
</tr> 
+0

Ему все еще не нравится ... –

+0

@AndrewChen: Я немного изменил выражение. Попробуй. –

+0

Это говорит о некорректном синтаксисе, когда я пытаюсь это сделать. Дело в том, что для hxs.select() аргумент должен быть окружен одинарными кавычками, я думаю. Поэтому, если «tablehead» и «player» окружены вместо одинарных кавычек, может показаться, что открытая одинарная кавычка «tablehead» закрывает самую внешнюю одинарную кавычку. –

4

Я столкнулся с этими проблемами раньше, попробуйте пропустить tbody в выражении xpath.

+0

omitting tbody решил мою проблему, но не знаю, как – codefreak

+0

Я думаю, что его ошибка в Scrapy не обрабатывает 'tbody' вообще ... странно .. сосет – Umair