Xpath 从输入标记中提取正确的值。。提供的图像:)

Xpath 从输入标记中提取正确的值。。提供的图像:),xpath,scrapy,Xpath,Scrapy,我正在使用scrapy crawl spider并尝试解析输出页面以选择一些输入标记参数类型、id、名称,每个数据类型都被选择到一个项目中,以便稍后将其存储在数据库中,类似于: Database Table_1 ╔════════════════╗ ║ text ║ ╠════════════════╣ ║ id │ name ║ ╟──────┼─────────╢ ║ │ ║ ╟──────┼─────────╢

我正在使用scrapy crawl spider并尝试解析输出页面以选择一些输入标记参数类型、id、名称,每个数据类型都被选择到一个项目中,以便稍后将其存储在数据库中,类似于:

 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
输出


如果我没弄错的话,您希望从输入中提取属性值

您当前的XPath为您提供了整个节点,因为这正是您所需要的。XPath选择器指向某个节点的某个点,但不能超出该点指向该节点的某个特定属性

要获取节点的id属性而不是节点本身,请执行以下操作:

some/xpath/query/@id
使用:

以获取id属性

使用:

获取由CurrentExpression元素选择的任何文本节点的子节点

最后,您可以将这两个表达式组合成一个表达式:


这将生成一个节点列表,其中的项目按如下顺序排列:id属性,text node*,换句话说,所选节点按文档顺序表示。

您能将您的解决方案应用到我的xpath吗?我刚才向您展示了原理。要提取属性值,请将/@attr\u name附加到当前XPath。$text\u input=hxs。选择//input[@id和@name以及@type='text']/@id.extract pass\u input=hxs。选择//input[@id和@name以及@type='file']/@id.extract file\u input=hxs。选择//input[@id和@name以及@type='file']/@id.extract>>这只给了我一个id[u'tbUsername'][u'tbPassword'][]@right.Sowd:为了能够将XPath表达式替换为更通用的表达式,您需要至少了解最小XPath。我认为您的替换错误,但很难从您的评论中阅读。您可以编辑问题并将其放在那里,或者提出新问题。正如我提到的,最好是学习mini请在这里提问之前使用XPath-否则您将无法理解和应用答案-如本例所示。@right.sowd:事实上,从您的评论中,我发现您甚至没有使用我答案中的XPath表达式…正确的输出应该是什么样子?@stav for type text>>[id,name],对于类型password[id,name],确切地说是[tbUsername,tbUsername],[tbPassword,tbPassword],我知道存在重复的值,但这是因为此表单id=name
some/xpath/query/@id
//yourCurrentExpression/@id
//yourCurrentExpression/text()
//yourCurrentExpression/@id | //yourCurrentExpression/text()