【问题标题】:Get links from code using xpath without pgid and sid使用没有 pgid 和 sid 的 xpath 从代码中获取链接
【发布时间】:2019-10-25 06:40:08
【问题描述】:

在使用 scrapy 为某些网站创建爬虫时,我使用 xpath 提取了链接。但是这些链接是一些东西链接这个

https://somedomain.com/someOtherUrl;sid=someSessionIdByServer;pgid=AgainSomeIdByServer

现在我不明白为什么即使href中只有url,为什么还要附加这个sid和pgid。我使用的 xpath 代码有点像

//a/@href

我可以只得到链接吗?那么,有没有办法只获取与 Scrapy 的链接。

我可以使用一些 python 代码来提取链接。但我很想知道在 xpath 中是否有任何处理方式,或者可能是在 scrapy 中设置。

【问题讨论】:

  • 你试过了吗? //a/tokenize(@href, ';')[1]
  • 当我使用标记化时,它给出了无效的表达式错误。 ??????
  • “现在我不明白为什么即使href中只有url,为什么还要附加这个sid和pgid。”你检查过实际代码(不是 DOM)吗?见docs.scrapy.org/en/latest/topics/…
  • 实际上是服务器将这个 pgid 和 sid 添加到链接中。我检查了网页的原始 html,然后我了解了如何访问链接。感谢您提供信息。

标签: python xpath web-scraping scrapy


【解决方案1】:

另一种方法是使用Scrapy的.re()re_first()

response.xpath('//a/@href').re(r'^([^;]+)')

【讨论】:

  • 谢谢。但那是使用 python 来获取数据。我正在寻找xpath方式。在 python 中使用 split 方法时我已经知道了。
【解决方案2】:

使用 xpath substring-before 函数。

//a/substring-before(@href, ';')

因为scrapy 仍然不支持tokenize(),在xpath 2.0 中可用

【讨论】:

    【解决方案3】:

    经过一些时间和努力,我知道了一些原因,为什么会发生这种情况。所以,我正在回答我自己的问题,因为它可能对其他人有所帮助。

    所以,pgid(进程组 ID)和 sid(会话 ID)是由服务器自己添加的。当我在浏览器上查看 DOM 时。我的浏览器已经处理了它,我无法在链接上看到 sid 和 pgid。但是当我使用 python 获取 html 时,链接确实是 url+sid+pgid 格式。原因在 this Scrapy Documentation中给出了

    我用过

    element.xpath("/a/@href").split(";")[0]
    

    只获取 url 并从链接中删除 sid 和 pgid。 它不是完整的 xpath 解决方案。但这解决了我的问题。

    【讨论】:

      猜你喜欢
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 2017-02-23
      • 2016-02-12
      • 1970-01-01
      相关资源
      最近更新 更多