Scrapy 选择器(Selectors)

本文介绍如何使用Python库如BeautifulSoup、lxml和Scrapy进行网页数据抓取。重点讲解了Scrapy的选择器机制,包括XPath、CSS和正则表达式,以及如何构造和使用选择器来提取HTML文档中的特定数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、 提取网页中的数据,一些现有的库可达到目的包括:

  • BeautifulSoup 是在程序员间非常流行的网页分析库,它基于HTML代码的结构来构造一个Python对象, 对不良标记的处理也非常合理,但它有一个缺点:慢
    1. lxml 是一个基于 ElementTree (不是Python标准库的一部分)的python化的XML解析库(也可以解析HTML)。

2、 Scrapy提取数据有自己的一套机制。它们被称作选择器(seletors),因为他们通过特定的 XPath 或者 CSS 表达式来“选择” HTML文件中的某个部分。

  • XPath 是一门用来在XML文件中选择节点的语言,也可以用在HTML上。
  • CSS 是一门将HTML文档样式化的语言。

3、 Scrapy selector是以 文字(text) 或 TextResponse 构造的 Selector 实例。 其根据输入的类型自动选择最优的分析方法(XML vs HTML)。
```

选择器:
xpath(query)
	寻找可以匹配xpath query 的节点,并返回 SelectorList 的一个实例结果,单一化其所有元素。列表元素也实现了 Selector 的接口。
exreact():
	串行化并将匹配到的节点返回一个unicode字符串列表。 结尾是编码内容的百分比。
css(query)
	应用给定的CSS选择器,返回 SelectorList 的一个实例。
	query 是一个包含CSS选择器的字符串
re(regex)
	应用给定的regex,并返回匹配到的unicode字符串列表。、
	regex 可以是一个已编译的正则表达式,也可以是一个将被 re.compile(regex) 编译为正则表达式的字符串。

HTML源码:

	<html>
 <head>
  <base href='http://example.com/' />
  <title>Example website</title>
 </head>
 <body>
  <div id='images'>
   <a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
   <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
   <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
   <a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
   <a href='image5.html'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
  </div>
 </body>
</html>
  • 构造选择器

     from scrapy.selector import Selector
     from scrapy.http import HtmlResponse
     
      response = HtmlResponse(url='http://baidu.com', body=body,encoding="utf8")
      Selector(response=response).xpath('//span/text()').extract()
      # response对象以 .selector 属性提供了一个selector
      response.selector.xpath('//span/text()').extract()
    
  • 使用选择器

    response.selector.xpath('//title/text()')
    	[<Selector (text) xpath=//title/text()>]
    response.css('title::text')
    	[<Selector (text) xpath=//title/text()>]
    
  • 嵌套选择器

     links = response.xpath('//a[contains(@href, "image")]')
    	links.extract()
    	 结果:
    	[u'<a href="image1.html">Name: My image 1 <br><img src="image1_thumb.jpg"></a>',
     	u'<a href="image2.html">Name: My image 2 <br><img src="image2_thumb.jpg"></a>',
     	u'<a href="image3.html">Name: My image 3 <br><img src="image3_thumb.jpg"></a>',
     	u'<a href="image4.html">Name: My image 4 <br><img src="image4_thumb.jpg"></a>',
     	u'<a href="image5.html">Name: My image 5 <br><img src="image5_thumb.jpg"></a>']
    
  • 结合正则表达式使用选择器

    response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')
    [u'My image 1',
     u'My image 2',
     u'My image 3',
     u'My image 4',
     u'My image 5']
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一介布衣+

做好事,当好人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值