Jim*_*ngs 4 python xpath web-crawler scrapy web-scraping
使用scrapy的python脚本,它从网站上抓取数据,将其分配给3个字段,然后生成.csv.工作正常,但有一个主要问题.所有字段都包含所有数据,而不是为每个表行分离.我确定这是由于我的循环不起作用,当它找到xpath时它只抓取每一行的所有数据,然后继续获取其他2个字段的数据,而不是创建单独的行
def parse(self, response):
hxs = HtmlXPathSelector(response)
divs = hxs.select('//tr[@class="someclass"]')
for div in divs:
item = TestBotItem()
item['var1'] = div.select('//table/tbody/tr[*]/td[2]/p/span[2]/text()').extract()
item['var2'] = div.select('//table/tbody/tr[*]/td[3]/p/span[2]/text()').extract()
item['var3'] = div.select('//table/tbody/tr[*]/td[4]/p/text()').extract()
return item
Run Code Online (Sandbox Code Playgroud)
带有*的tr增加了我需要抓取的网站上的每个条目,其他两个路径插入下面.我如何编辑这个,所以它只抓取说// table/tbody/tr [3]的第一组数据,将它存储到所有三个字段,然后转到// table/tbody/tr [4]等? ?
更新
工作正常,但我正在尝试向pipelines.py文件添加一些验证,以删除var1大于100%的任何记录.我确定下面的代码是错的,而且"yield"而不是"return"会停止正在使用的管道吗?
from scrapy.exceptions import DropItem
class TestbotPipeline(object):
def process_item(self, item, spider):
if item('var1') > 100%:
return item
else:
raise Dropitem(item)
Run Code Online (Sandbox Code Playgroud)
我认为这就是你要找的东西:
def parse(self, response):
hxs = HtmlXPathSelector(response)
divs = hxs.select('//tr[@class="someclass"]')
for div in divs:
item = TestBotItem()
item['var1'] = div.select('./td[2]/p/span[2]/text()').extract()
item['var2'] = div.select('./td[3]/p/span[2]/text()').extract()
item['var3'] = div.select('./td[4]/p/text()').extract()
yield item
Run Code Online (Sandbox Code Playgroud)
你循环trs然后使用相对的XPath表达式(./td...),并在每次迭代中使用yield指令.
您还可以将每个项目附加到列表并将该列表返回到循环之外)这样(它等同于上面的代码):
def parse(self, response):
hxs = HtmlXPathSelector(response)
divs = hxs.select('//tr[@class="someclass"]')
items = []
for div in divs:
item = TestBotItem()
item['var1'] = div.select('./td[2]/p/span[2]/text()').extract()
item['var2'] = div.select('./td[3]/p/span[2]/text()').extract()
item['var3'] = div.select('./td[4]/p/text()').extract()
items.append(item)
return items
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9987 次 |
| 最近记录: |