Scrapy 选择器(Selectors)

版权声明:随心所欲、无欲无求! https://blog.csdn.net/qq_32662595/article/details/85113851

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']
    

猜你喜欢

转载自blog.csdn.net/qq_32662595/article/details/85113851