如何使用xpath从另一个元素内的元素中提取文本数据

时间:2017-10-14 16:53:35

标签: python-3.x xpath css-selectors scrapy

我有以下数据:

<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。

1 个答案:

答案 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选择器

您的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会这样做。

您现有的XPath选择器

实际上

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