【问题标题】:Scrapy - incrementing number in a stringScrapy - 字符串中的递增数字
【发布时间】:2013-11-30 17:06:28
【问题描述】:

再一次,我似乎在这个问题上有一堵砖墙,我希望有人能不费吹灰之力地回答它。

下面是一个示例代码:

def parse_page(self,response):
    hxs = HtmlXPathSelector(response)

    item = response.meta['item']
    item["Details_H1"] = hxs.select('//*[@id="ctl09_p_ctl17_ctl04_ctl01_ctl00_dlProps"]/tr[1]/td[1]/text()').extract()
    return item

似乎Details_H1 中的@id 可能会改变。例如。对于一个页面,它可以是@id="ctl08_p_ctl17_ctl04_ctl01_ctl00_dlProps,对于下一页,它是随机的@id="ctl09_p_ctl17_ctl04_ctl01_ctl00_dlProps

我想实现一个等效的do until 循环,以便代码循环遍历以 1 为增量的数字,直到 XPath 产生的值非零。因此,例如我可以设置 i=108 并且每次 i=i+1 直到hxs.select('//*[@id="ctl09_p_ctl17_ctl04_ctl01_ctl00_dlProps"]/tr[1]/td[1]/text()').extract() []

我将如何实现这一点?

非常感谢您的帮助和贡献

编辑 1

TNT 解决了以下问题。代码应为:

def parse_page(self,response):
    hxs = HtmlXPathSelector(response)

    item = response.meta['item']
    item["Details_H1"] = hxs.select('//*[contains(@id, "_p_ctl17_ctl04_ctl01_ctl00_dlProps")]/tr[1]/td[1]/text()').extract()
    return item

【问题讨论】:

  • 使用一个全局变量或一个作为计数器的参数,并格式化你的字符串以适应它。
  • 我对python语法不太熟悉。您能否提供一个示例或将我链接到涵盖它的文章

标签: python xpath web-scraping screen-scraping scrapy


【解决方案1】:

“自然”的 XPATH 方式是更概括您的 xpath 表达式:

xp = '//*[contains(@id, "_p_ctl17_ctl04_ctl01_ctl00_dlProps")]/tr[1]/td[1]/text()'
item["Details_H1"] = hxs.select(xp).extract()

但我在黑暗中摸索。您的 xpath 表达式可能最好以 //table//tbody 之类的开头

在任何情况下,“一直做到”都是丑陋的。

【讨论】:

  • 我也会尝试你的方法,并会报告!我删除//tbody 的原因是因为我无法根据这里的这篇文章提取任何结果:link。干杯
  • 刚刚试了一下,效果很好!我已经编辑了上面的代码(在我的初始帖子中)以反映修复。仅供参考,有没有办法为contains 提供OR 函数。 IE。假设它包含"ctl17""ctl01_ctl00_dlProps"。像[contains(@id, "ctl17", "ctl01_ctl00_dlProps")]一样简单吗?干杯
【解决方案2】:

你可以试试这个

i = 108
while True:
    item = response.meta['item']
    xpath = '//*[@id="ct%d_p_ctl17_ctl04_ctl01_ctl00_dlProps"]/tr[1]/td[1]/text()' %i
    item["Details_H1"] = hxs.select(xpath).extract()
    if not item["Details_H1"]:
        break
    i += 1
    yield item

【讨论】:

  • 您好,我尝试了您编写的代码,但对我来说不起作用。我改变了 i=8 和 xpath='//*[@id="ctl0%d_p_c.....' %i 因为它是 l08 而不是 108。我什至尝试改变 yield item 的缩进位置你有没有其他建议?感谢您的帮助
  • 编辑:某处应该有 i = i + 1 吗?
  • 你能具体说明它导致了什么问题吗?
  • 今晚我将尝试新语法。它没有产生任何输出。您是否能够编辑您的代码以包含def parse_page(self,response): hxs = HtmlXPathSelector(response)?我只需要知道缩进的样子。我还假设 return item 被替换为 yield item
  • 仍然无法正常工作。您是否有完整的代码可以作为演示提供?这样我也可以获得更好的上下文。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 2017-04-30
  • 2015-08-28
  • 1970-01-01
相关资源
最近更新 更多