【问题标题】:How to extract text data from an element that is inside another element with xpath如何使用xpath从另一个元素内的元素中提取文本数据
【发布时间】:2018-03-26 14:25:42
【问题描述】:

我有如下数据:

<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 顺便说一句。

【问题讨论】:

  • 你试过什么?请添加一些信息,说明为什么您无法自己使用它。

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


【解决方案1】:

你想要这样的东西吗?

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')

我建议您阅读一些 XPath 教程和一些关于 CSS 选择器的教程。它们都很简单。

您现有的 CSS 选择器

您的 CSS 选择器 response.css('div.a.span') 错误。在 CSS 中,一个点表示class,多个点表示多个类,因此此选择器将搜索类a 和类spandiv 标记,即

<div class="a span">sample</div>

正确的 CSS 选择器应该是

response.css('div a span::attr(title)')

(如果您的框架确实支持 attr 表示法,scrapy 支持)。

您现有的 XPath 选择器

response.xpath('//div/a/span[@title]') 实际上应该是正确的,您可以使用在线提供的 xpath 测试器之一来验证这一点(例如codebeautify Xpath-Tester)。您必须先清理代码,因为您的 title 属性缺少结束引号,因此不是有效的 XML。

如果这正是您的原始代码,包括缺少的引号,那么这可能就是问题所在。在线 XPath 引擎通常不会解析它,因为它们需要有效的 XML。 Scrapy 会解析它,因为它也解析 HTML 和脏 HTML,但它可能会导致不同的 DOM 树。您可能想稍微摆弄一下scrapy控制台并检查不同的选择器层次结构,例如//span[@title]//div/a//div/a/span等,看看会发生什么。

response.xpath('//div//span') 确实非常广泛,它可以找到所有span 之后的div 在任何后代级别。

【讨论】:

  • ,我已经尝试过那个 xpath 表达式,但是它返回一个空列表,而且数据非常广泛,正如您所想象的那样,ids 对于所有跨度标签都不同,所以我不能使用id 来识别我试图在这里抓取的内容
  • 我为您现有的选择器添加了一些更新。我认为产生 0 结果的 XPath 选择器应该是正确的(在我修复了粘贴代码中的 XML 错误之后)。因此,XPath 选择器的问题应该出在其他地方。源代码中的错误导致另一个 DOM 树或其他错误。
  • 感谢关于 css 选择器的那一点信息,但是尽管付出了所有努力,我仍然无法访问 span 标签。即使 #quickLookItem-1 &gt; div:nth-child(2) &gt; a:nth-child(1) &gt; span:nth-child(1) 不起作用。response.xpath('//div/a')doesnt 甚至返回 span标签。感谢您的努力
  • 删除最后一条评论,response.css('#quickLookItem-1 &gt; div:nth-child(2) &gt; a:nth-child(1) &gt; span:nth-child(1)') 确实有效,再次感谢您的宝贵时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多