【问题标题】:Scrapy Extract number from page text with regex使用正则表达式从页面文本中提取数字
【发布时间】:2014-12-30 15:33:56
【问题描述】:

我一直在寻找几个小时来了解如何搜索页面上的所有文本,如果它与正则表达式匹配,然后提取它。我的蜘蛛设置如下:

def parse(self, response):
        title = response.xpath('//title/text()').extract()
        units = response.xpath('//body/text()').re(r"Units: (\d)")
        print title, units

我想提取页面上“单位:”后面的数字。当我在正文中包含 Units: 351 的页面上运行 scrapy 时,我只得到页面的标题,前后有一堆转义符,而没有任何单位。

我是scrapy的新手,有一点python经验。任何有关如何在 Units: 之后提取整数并从标题中删除额外转义字符“u'\r\n\t...”的帮助将不胜感激。

编辑: 根据评论,这里是示例页面的部分 html 提取。请注意,这可能在本例中除 p 之外的不同标签内:

<body>
<div> Some content and multiple Divs here <div>
<h1>This is the count for Dala</h1>
<p><strong>Number of Units:</strong> 801</p>
<p>We will have other content here and more divs beyond</p>
</body>

根据下面的答案,这就是其中的大部分内容。仍在努力删除 Units: 和额外的转义字符。

units = response.xpath('string(//body)').re("(Units: [\d]+)")

【问题讨论】:

  • 您能否在页面上显示Units ... 文本的示例位置? HTML代码会很好。我很确定您不需要扫描所有元素。
  • @alecxe 单位可以在页面上的任何位置,不一定在同一位置或同一标签内。唯一不变的是文本“Units:”。我包含了一个示例页面,该页面当前只返回一个标题并且对于单位是空的。
  • 谢谢,strong 标签呢,Number of Units: 总是在strong 里面吗?
  • @alecxe 不,他们不需要在其周围放置任何标签。只要有单位:。这就是为什么我试图搜索正文标签并匹配正则表达式的原因。我知道没有标签可去是不理想的,但这就是我剩下的。
  • 明白了。您能否提供几个涵盖其他案例的示例?会有很大帮助。谢谢。

标签: regex python-2.7 scrapy


【解决方案1】:

试试:

response.xpath('string(//body)').re(r"Units: (\d)")

【讨论】:

  • 这确实从上面的例子中得到 Units: 8 所以这更接近。我以为 \d 会拉出整个数字。我将进一步研究必须与我的正则表达式有关。谢谢。
  • @Xaxum 使用\d+ 而不是\d
  • 谢谢。你知道如何去掉一些文本中出现的所有那些 \r\t.. 字符吗?
  • @Xaxum 尝试在 XPath 中使用 normalize-space(//body) 而不是 string(//body)
  • @Xaxum 顺便说一句,了解一些用于网络抓取的 XPath 非常有帮助——您可能会喜欢我不久前收集的 XPath 技巧列表:blog.scrapinghub.com/2014/07/17/…
猜你喜欢
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
相关资源
最近更新 更多