【问题标题】:xpath works for just one item when add // in it在其中添加 // 时,xpath 仅适用于一项
【发布时间】:2014-02-16 05:20:59
【问题描述】:

我有这个 html 页面

<page>
<div class="results-list">

    <div class="item paid-featured-item"></div>
    <div class="item paid-featured-item"></div>
    <div class="item paid-featured-item"></div>
    <div class="item paid-featured-item"></div>
    <div class="item paid-featured-item"></div>
    <div class="item paid-featured-item"></div>
    <div class="item paid-featured-item"></div>
    <div class="item paid-featured-item"></div>

</div>
</page>

在每个“项目付费功能项目”中,我都有这个:

<div class="item paid-featured-item">
    <div class="somethign">
        <div class="title">
            This is the title
        </div>
    </div>
    <div class="anotherthing">
    </div>
</div>

我想使用 xpath 提取标题。

我尝试过的

Container = "//div[@class='results-list']"

for item in Container:
    title = "//div[@class='title']/text()"

我有 8 个标题,但每个标题都是第一个项目的标题。

我确定那是因为我使用了 //

请问我该怎么办?

第一

我不想使用 css 选择器,因为我的工作中不允许使用它

我不想使用class="something",因为这个 div 并不总是存在于我的页面中。

第三

我在 python 中使用 scrapy

第四

感谢您的帮助

【问题讨论】:

  • 意料之中.. DOM id 在整个文档中必须是唯一的。搜索 ID 的查询将永远不会返回任何内容,除了找到的第一个 ID,因为它不允许有重复的 ID。
  • 在我的页面中,有 24 个 id 同名,即title
  • 那么您还有什么期望。 ID 必须是唯一的,因此您有 ONE 标题元素和 23 个非法重复项。
  • 这与 id 无关,老实说,即使class 我也有同样的问题。我的问题是使用// 总是给我第一个项目。
  • 您需要显示您的实际 xpath/retrieval 代码。 //foo 将检索所有 foo 项作为 DOMNodeList,但实际处理该列表是否正确取决于您。

标签: python-2.7 xpath scrapy


【解决方案1】:

假设您的页面看起来像 (page.html):

<page>
  <div id="results-list">
    <div class="item paid-featured-item">
      <div class="something">
        <div class="title">Title 1</div>
      </div>
      <div class="anotherthing"></div>
    </div>
    <div class="item paid-featured-item">
      <div class="something">
        <div class="title">Title 2</div>
      </div>
      <div class="anotherthing"></div>
    </div>
    <div class="item paid-featured-item">
      <div class="something">
        <div class="title">Title 3</div>
      </div>
      <div class="anotherthing"></div>
    </div>
    <div class="item paid-featured-item">
      <div class="something">
        <div class="title">Title 4</div>
      </div>
      <div class="anotherthing"></div>
    </div>
  </div>
</page>

要提取每个标题,您可以:

from scrapy.selector import Selector
sel = Selector(text=open('page.html').read())

container = sel.xpath('//div[@id="results-list"]')
items = container.xpath('.//div[@class="item paid-featured-item"]')
for item in items:
    # *extracted* is a single-item list containing the title.
    extracted = item.xpath('.//div[@class="title"]/text()').extract()
    title = extracted[0]
    print title

这将输出:

Title 1
Title 2
Title 3
Title 4

【讨论】:

  • 不,我的朋友,我在问题中写的只是一般情况。我在问// 总是给我第一个项目。
  • 很抱歉,这只是错字
  • @MarcoDinatsoli 我还在努力,我只拿到了第一部分
  • 感谢您对我的高度赞赏。我的问题是我也只是第一个项目。我需要循环获取每个标题
  • @MarcoDinatsoli Yours 是伪代码,因此它可以解释,但看起来您将container 迭代为item,而不是它的子代。所以itemcontainer 元素。然后,用//div[@class='title']/text() 抓取标题实际上抓取了每个标题。您想在特定项目上使用 .// 以仅获取后代标题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 2016-12-27
  • 2016-08-25
相关资源
最近更新 更多