我有以下数据:
<div>
<a rel="nofollow" class="someclass " href="www.example.com">
<span id="name" title="Title of interest>
<b class="highlight">Other test</b>
<b class="highlight">Moretext</b>
</span>
</a>
</div>
编辑:我试过了:
response.xpath('//div/a/span[@title]')
,但由于某种原因,这会返回一个空列表。
我也尝试过:
response.css('div.a.span')
,结果是一样的。
我最接近的是:
response.xpath('//div//span')
,毫无疑问,这会带来理想的结果......其他事情......这不是我正在寻找的事情
我正在尝试获取span元素的title属性。我想知道如何使用xpath或css选择器来完成它。
我正在使用python 3和scrapy btw。
答案 0 :(得分:2)
你想要这样的东西吗?
CSS:
response.css('#name::attr(title)').extract()
的XPath:
response.xpath('span[@id="name"]/@title')
现在,这并没有考虑到元素“在另一个元素中”。在这种情况下,我们不需要周围的元素,因为HTML标准声明id
属性值在整个HTML页面上必须是唯一的。
但是,如果您还有其他情况需要查询多个元素层次结构,则可以在CSS中使用空格和XPath中的斜杠嵌套它们。
CSS:
response.css('div a #name::attr(title)').extract()
的XPath:
# // means "anywhere in the hierarchy in Xpath
response.xpath('//div/a/span[@id="name"]/@title')
我建议你阅读一些关于CSS选择器的XPath教程和一些教程。它们都很简单。
您的CSS选择器response.css('div.a.span')
错误。在CSS中,点表示class
,多个点表示多个类,因此此选择器将搜索具有类div
和类a
的{{1}}标记,即
span
正确的CSS选择器将是
<div class="a span">sample</div>
(如果您的框架确实支持response.css('div a span::attr(title)')
符号,scrapy会这样做。
attr
应该是正确的,您可以使用在线提供的其中一个xpath测试人员验证这一点(例如codebeautify Xpath-Tester)。您之前必须清理代码,因为您的title属性缺少结束引号,因此不是有效的XML。
如果这正是您的原始代码,包括缺少的引号,可能这就是问题所在。在线XPath引擎通常不会解析它,因为它们需要有效的XML。 Scrapy将解析它,因为它还解析HTML和脏HTML,但它可能导致不同的DOM树。你可能想稍微调整一下scrapy控制台并检查不同的选择器层次结构,如response.xpath('//div/a/span[@title]')
,//span[@title]
,//div/a
等,看看会发生什么。
//div/a/span
确实非常广泛,它会在任何级别的下降中找到response.xpath('//div//span')
之后的所有span
。