scrapy xpath中提取多个class值

xpath中没有提供对class的原生查找方法。但是 stackoverflow 看到了一个很有才的回答:

This selector should work but will be more efficient if you replace it with your suited markup:
这个表达式应该是可行的。不过如果你把class换成更好识别的标识执行效率会更高

//*[contains(@class, 'Test')]  

But since this will also match cases like class="Testvalue" or class="newTest".

但是这个表达式会把类似 class="Testvalue" 或者 class="newTest"也匹配出来。

//*[contains(concat(' ', @class, ' '), ' Test ')]  

If you wished to be really certain that it will match correctly, you could also use the normalize-space function to clean up stray whitespace characters around the class name (as mentioned by @Terry)

如果您希望确定它能够正确匹配,则还可以使用 normalize-space 函数清除类名周围的空白字符(如@Terry所述)

//*[contains(concat(' ', normalize-space(@class), ' '), ' Test ')]  

Note that in all these versions, the * should best be replaced by whatever element name you actually wish to match, unless you wish to search each and every element in the document for the given condition.

请注意在所有这些版本里,除非你想要在所有元素里搜索带有这些条件的元素,否则你最好把*号替换成你想要匹配的具体的元素名(标签名)。

具体来讲大概就是这样:

html = """
<div class="view_fields">
    <div class="row view_row">
        <!-- row header -->
        <div class="view_field col-xs-4 col-sm-5 col-md-4">Organization 
        </div>
        <!-- row value -->
          <div class="view_value col-xs-8 col-sm-7 col-md-8">
            <a href="/org/14607">INTERNET HARBOR</a>
          </div>
    </div>
</div>
"""

items = response.xpath('//div[contains(@class,"view_fields")]')

 

相反:不包含指定的属性或值

    如果查找某个属性值是否包含或不包含指定的属性或值时:结合Xpath路径来提取循环列表中的一个HTML标签的InnerText,提取的时候需要判断是这个标签的class属性是否包含某个指定的属性值,利用Xpath的contains可以解决,代码如下:

 

//选择不包含class属性的节点
var result = node.SelectNodes(".//span[not(@class)]");
//选择不包含class和id属性的节点
var result = node.SelectNodes(".//span[not(@class) and not(@id)]");
//选择不包含class="expire"的span
var result = node.SelectNodes(".//span[not(contains(@class,'expire'))]");
//选择包含class="expire"的span
var result = node.SelectNodes(".//span[contains(@class,'expire')]");

查询值为空的节点

xml.xpath("//[XX[.!='']]")
--------------------------------------//td[.!= '']---------------------------------------------------------------- if each.xpath("./td[2]/text()[.!= '']"): self.positionType = each.xpath("./td[2]/text()").extract()[0] else: self.positionType = "未知"

 

博客搬运地址

转载于:https://www.cnblogs.com/clement-jiao/p/9129153.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scrapy默认是单线程执行爬取任务的,但可以使用Twisted框架的异步特性来实现多线程。下面是一种实现多线程的方法: 1. 创建一个Spider类,并继承scrapy.Spider。 2. 在Spider类,添加一个start_requests方法,用于生成初始的请求。 3. 在start_requests方法,使用yield关键字返回一个或多个Request对象。 4. 在Spider类,添加一个parse方法,用于处理爬取到的响应。 5. 在parse方法,解析响应的内容,并提取所需的数据。 6. 在parse方法,可以使用yield关键字返回需要继续爬取的请求,实现爬取链接的自动跟进。 7. 在项目的settings.py文件,设置CONCURRENT_REQUESTS参数为所需的线程数。 示例代码如下: ```python import scrapy from scrapy.crawler import CrawlerProcess class MySpider(scrapy.Spider): name = 'my_spider' def start_requests(self): urls = ['http://example.com/page1', 'http://example.com/page2', ...] for url in urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): # 解析响应并提取数据 data = response.xpath('//div[@class="data"]/text()').get() yield {'data': data} # 提取链接并继续爬取 next_page_url = response.xpath('//a[@class="next-page"]/@href').get() if next_page_url: yield scrapy.Request(url=next_page_url, callback=self.parse) process = CrawlerProcess(settings={ 'CONCURRENT_REQUESTS': 8, # 设置线程数 }) process.crawl(MySpider) process.start() ``` 在上述示例,通过设置CONCURRENT_REQUESTS参数为8,实现了8个线程并发执行爬取任务。你可以根据实际需求调整线程数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值