【问题标题】:Get content between comments in Scrapy在 Scrapy 中获取评论之间的内容
【发布时间】:2014-12-10 09:58:13
【问题描述】:

我正在尝试通过 Scrapy 获取 cmets 之间的内容。我已经找到了this,但除了以这种方式提取 cmets 外,我并没有走得更远。不过,我的目标是在每次“开始评论”和“结束评论”发生时获得 2 个 cmets 之间的所有内容。假设网站上的区块结构如下:

<!-- Start -->
<div class.. >
    <ul>...
        more content
    </ul>
</div>
<!-- End -->

<!-- Start -->
    same structure, different entries
<!-- End -->

<!-- Start -->
    same structure, different entries
<!-- End -->
....

我正在寻找的是类似于 xpath 的东西来查找特定字符串并将它们全部保存在一个列表中,并且会得到一个有点类似于“[contentBlock1,contentBlocks2,...]”的输出,就像这样您通常使用 xpath 获得输出。任何有帮助的东西都会受到高度赞赏:)

编辑:值得注意的是,我目前正在使用一个scrapy响应/选择器对象。能够处理任何一个的解决方案将是首选。

【问题讨论】:

标签: python xpath comments scrapy block


【解决方案1】:

类似 response.xpath('.//*[@id="your id here"]/ul/text()').extract() 应该这样做

【讨论】:

  • 尚未工作,可能是因为我想知道这将如何识别块的结束位置。还有什么是“id”,因为没有直接设置 id 或者 scrapy 是否允许您只设置一个评论 = id?
  • 抱歉,
    应该与 //div[\@class='foo'] 匹配,所以将 '@id' 更改为 '@class'。
  • 哦,我觉得当时还不够清楚。我真的必须按 cmets 而不是类进行过滤,因为类名发生了变化和/或也用于我不想使用的块。
  • 因为你有相同的结构消息,我假设你对每条评论都有相同的类名。您能否发布一个“真实”的 html 示例,这会有所帮助:)
  • 是的,我理解这种混淆,但我认为“在 cmets 之间”会很清楚:P 在此处复制一个示例:pastebin.com/hLygUE0p
【解决方案2】:

如果你愿意使用re,你可以试试这个。

print re.findall(r"(?<=<!-- Start -->\s)(.*?)(?=\s<!-- End -->)",test_string,re.DOTALL)

这将返回一个包含您想要的列表。

查看演示。

https://regex101.com/r/nL5yL3/17

【讨论】:

  • 是的,我已经在尝试使用 re 模块,这看起来很合乎逻辑。 “test_string”变量究竟代表什么?直接使用我从选择器获得的内容在这里不起作用(当然,它不是真正的字符串)。
  • @Shin 整个内容都必须是字符串。你输入的表单是什么?我们可以把它转换成字符串吗?
  • 如前所述,我正在使用 Scrapy。 yield Request("url", def) 的响应是 ,使用 Selector(response) 返回 。既没有字符串,也不确定以某种方式创建字符串是否有意义。会调查的。
猜你喜欢
相关资源
最近更新 更多
热门标签