2012-07-02 2 views
1

Я использую scipping scraw spraw и пытаюсь разобрать выходные страницы, чтобы выбрать какой-либо параметр входного тега (тип, идентификатор, имя), каждый тип данных выбран в элемент так что она будет храниться в базе данных позже что-то вроде этого:Извлечение правильных значений формы входной тег .. изображения предоставлены :)

Database Table_1 
╔════════════════╗ 
║  text  ║ 
╠════════════════╣ 
║ id │ name ║ 
╟──────┼─────────╢ 
║  │   ║ 
╟──────┼─────────╢ 
║  │   ║ 
╚══════╧═════════╝ 

то же самое будет в пароле и файл, но,

Проблема я лицо, что извлекает XPath весь тег !!

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from scrapy.item import Item, Field 
from isa.items import IsaItem 


class MySpider(CrawlSpider): 
    name = 'example.com' 
    allowed_domains = ['testaspnet.vulnweb.com'] 
    start_urls = ['http://testaspnet.vulnweb.com'] 


    rules = (
      Rule(SgmlLinkExtractor(allow=('/*')),callback='parse_item'),) 

    def parse_item(self, response): 
     self.log('%s' % response.url) 

     hxs = HtmlXPathSelector(response) 
     item=IsaItem() 
     text_input=hxs.select("//input[(@id or @name) and (@type = 'text')]").extract() 
     pass_input=hxs.select("//input[(@id or @name) and (@type = 'password')]").extract()  
     file_input=hxs.select("//input[(@id or @name) and (@type = 'file')]").extract() 

     print text_input , pass_input ,file_input 
     return item 

Выход

[email protected]:~/isa/isa$ scrapy crawl example.com -L INFO -o file_nfffame.csv -t csv 
2012-07-02 12:42:02+0200 [scrapy] INFO: Scrapy 0.14.4 started (bot: isa) 
2012-07-02 12:42:02+0200 [example.com] INFO: Spider opened 
2012-07-02 12:42:02+0200 [example.com] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 
[] [] [] 
[] [] [] 
[] [] [] 
[u'<input name="tbUsername" type="text" id="tbUsername" class="Login">'] [u'<input name="tbPassword" type="password" id="tbPassword" class="Login">'] [] 
[] [] [] 
[u'<input name="tbUsername" type="text" id="tbUsername" class="Login">'] [u'<input name="tbPassword" type="password" id="tbPassword" class="Login">'] [] 

[] [] [] 
2012-07-02 12:42:08+0200 [example.com] INFO: Closing spider (finished) 
+0

Как выглядит правильный вывод? –

+0

@stav для текста типа >> [id, name], для типа password [id, name], точно ["tbUsername", "tbUsername"], ["tbPassword", "tbPassword"], я знаю, что есть дублированный но это, так как эта форма id = name –

ответ

0

Если я вас понял правильно, вы хотите, чтобы извлечь значения атрибутов из входов.

Ваш текущий XPath дает вам целые узлы, потому что это то, о чем вы просите. Селекторы XPath подходят к узлу узла, но не за его пределами, к определенному атрибуту этого узла.

Чтобы получить узла атрибута id, а не сам узел:

some/xpath/query/@id 
+0

вы можете применить свое решение к моему xpath любезно? –

+0

Я просто показывал вам принцип. Чтобы извлечь значение атрибута, добавьте '/ @ attr_name' к вашему текущему XPath. – Utkanos

0

Использование:

//yourCurrentExpression/@id 

, чтобы получить id атрибуты.

Использование:

//yourCurrentExpression/text() 

для получения текста узла ребенка любого выбранного по yourCurrentExpression элемента.

Наконец, вы могли бы объединить эти два выражения в один:

//yourCurrentExpression/@id | //yourCurrentExpression/text() 

Это производит узел-лист, где его элементы упорядочены, как: (id-attribute, text-node)*, другими словами, выбранные узлы представлены в порядок документа.

+0

$ text_input = hxs.select ("// input [(@ id и @name) и (@type = 'text')]/@ id"). Extract() pass_input = hxs.select ("// input [(@id и @name) и (@type = 'password')]/@ id "). extract() \t \t file_input = hxs.select (" // input [(@ id и @name) и (@type = 'file')]/@ id "). extract() >> это дало мне только id [u'tbUsername '] [u'tbPassword'] [] –

+0

извините, я попытался отформатировать мой ответ, но я могу 't :( –

+0

@ right.sowrd: вам нужно знать хотя бы минимальный XPath, чтобы иметь возможность заменить выражение XPath на более общий. Я думаю, что вы сделали замену неправильно, но с вашего комментарий.Вы можете отредактировать свой вопрос и поставить их там - или задать новый вопрос. Как я уже говорил, лучше всего изучить минимальный XPath, прежде чем задавать вопросы здесь - иначе вы не сможете понять и применить ответы - как ясно видно из этого случая. –

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