2013-11-17 5 views
0

Снова у меня, похоже, кирпичная стена с этим, и я надеюсь, что кто-то сможет ответить на него с головы.Scrapy - увеличивающееся число в строке

Вот пример кода ниже:

def parse_page(self,response): 
    hxs = HtmlXPathSelector(response) 

    item = response.meta['item'] 
    item["Details_H1"] = hxs.select('//*[@id="ctl09_p_ctl17_ctl04_ctl01_ctl00_dlProps"]/tr[1]/td[1]/text()').extract() 
    return item 

кажется, что @id в Details_H1 может измениться. НАПРИМЕР. Для страницы это может быть @id="ctl08_p_ctl17_ctl04_ctl01_ctl00_dlProps, а на следующей странице - @id="ctl09_p_ctl17_ctl04_ctl01_ctl00_dlProps.

Я хотел бы реализовать эквивалент цикла do until, чтобы код циклически повторял числа с приращениями 1 до тех пор, пока значение, получаемое XPath, не равно нулю. Так, например, я мог бы установить i = 108 и каждый раз i = i + 1 до hxs.select('//*[@id="ctl09_p_ctl17_ctl04_ctl01_ctl00_dlProps"]/tr[1]/td[1]/text()').extract() <> []

Как я мог бы реализовать это?

Вашей помощи и вклад высоко оценили

EDIT 1

Фикса адресованного тротилом ниже. Код должен гласить:

def parse_page(self,response): 
    hxs = HtmlXPathSelector(response) 

    item = response.meta['item'] 
    item["Details_H1"] = hxs.select('//*[contains(@id, "_p_ctl17_ctl04_ctl01_ctl00_dlProps")]/tr[1]/td[1]/text()').extract() 
    return item 
+0

Используйте глобальную переменную или аргумент, который служит в качестве счетчика, и отформатируйте свою строку, чтобы соответствовать этому. – aIKid

+0

Я не слишком хорошо знаком с синтаксисом python. Не могли бы вы предоставить мне пример или связать меня со статьей, где она покрыта. – slixor

ответ

1

'естественной' XPATH путь будет более обобщать свой XPATH expresssion:

xp = '//*[contains(@id, "_p_ctl17_ctl04_ctl01_ctl00_dlProps")]/tr[1]/td[1]/text()' 
item["Details_H1"] = hxs.select(xp).extract() 

Но я ощупью в темный. Ваше xpath выражение, вероятно, лучше начать с чего-то вроде //table или //tbody

В любом случае «делать до» было бы уродливо.

+0

Я попробую ваш подход тоже nd отчитается! Причина, почему я удалил '// tbody', состоит в том, что я не смог получить никаких результатов в этом сообщении здесь: [link] (http://stackoverflow.com/questions/7941060/parsing-html-with-xpath -python-SCRAPY). Cheers – slixor

+0

Просто попробовал, и это работает! Я отредактировал мой код выше (в моем первоначальном сообщении), чтобы отразить исправление. Как FYI, есть ли способ иметь функцию 'OR' для' contains'. И.Е.Скажем, если он содержит '' ctl17 ''или' 'ctl01_ctl00_dlProps" '. Это так же просто, как '[содержит (@id," ctl17 "," ctl01_ctl00_dlProps ")]'? ура – slixor

0

Вы можете попробовать это

i = 108 
while True: 
    item = response.meta['item'] 
    xpath = '//*[@id="ct%d_p_ctl17_ctl04_ctl01_ctl00_dlProps"]/tr[1]/td[1]/text()' %i 
    item["Details_H1"] = hxs.select(xpath).extract() 
    if not item["Details_H1"]: 
     break 
    i += 1 
    yield item 
+0

Hi omair, Я пробовал код, который вы написали, но он не работает на моем конце. Я изменил i = 8 и xpath = '// * [@ id = "ctl0% d_p_c .....'% i, так как это l08 не 108. Я даже попытался изменить позицию отступа элемента доходности Вы Есть ли какие-либо другие предложения? Я ценю вашу помощь – slixor

+0

EDIT: Если есть i = i + 1 где-то? – slixor

+0

вы можете указать, какую проблему он вызывает? –

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