Scrapy - ตัวเลือก

คำอธิบาย

เมื่อคุณขูดหน้าเว็บคุณจำเป็นต้องแยกส่วนหนึ่งของซอร์ส HTML โดยใช้กลไกที่เรียกว่า selectorsทำได้โดยใช้นิพจน์ XPath หรือ CSS ตัวเลือกถูกสร้างขึ้นจากไฟล์lxml ไลบรารีซึ่งประมวลผล XML และ HTML ในภาษา Python

ใช้ข้อมูลโค้ดต่อไปนี้เพื่อกำหนดแนวคิดต่างๆของตัวเลือก -

<html>
   <head>
      <title>My Website</title>
   </head>
   
   <body>
      <span>Hello world!!!</span>
      <div class = 'links'>
         <a href = 'one.html'>Link 1<img src = 'image1.jpg'/></a>
         <a href = 'two.html'>Link 2<img src = 'image2.jpg'/></a>
         <a href = 'three.html'>Link 3<img src = 'image3.jpg'/></a>
      </div>
   </body>
</html>

การสร้างตัวเลือก

คุณสามารถสร้างอินสแตนซ์คลาสตัวเลือกโดยส่งไฟล์ text หรือ TextResponseวัตถุ. ขึ้นอยู่กับประเภทอินพุตที่ระบุตัวเลือกจะเลือกกฎต่อไปนี้ -

from scrapy.selector import Selector 
from scrapy.http import HtmlResponse

โดยใช้โค้ดด้านบนคุณสามารถสร้างจากข้อความเป็น -

Selector(text = body).xpath('//span/text()').extract()

มันจะแสดงผลลัพธ์เป็น -

[u'Hello world!!!']

คุณสามารถสร้างจากการตอบสนองเป็น -

response = HtmlResponse(url = 'http://mysite.com', body = body) 
Selector(response = response).xpath('//span/text()').extract()

มันจะแสดงผลลัพธ์เป็น -

[u'Hello world!!!']

การใช้ Selectors

ด้วยการใช้ข้อมูลโค้ดอย่างง่ายข้างต้นคุณสามารถสร้าง XPath เพื่อเลือกข้อความที่กำหนดไว้ในแท็กหัวเรื่องดังที่แสดงด้านล่าง -

>>response.selector.xpath('//title/text()')

ตอนนี้คุณสามารถดึงข้อมูลที่เป็นข้อความโดยใช้ไฟล์ .extract() วิธีแสดงดังต่อไปนี้ -

>>response.xpath('//title/text()').extract()

มันจะให้ผลลัพธ์เป็น -

[u'My Website']

คุณสามารถแสดงชื่อขององค์ประกอบทั้งหมดที่แสดงดังต่อไปนี้ -

>>response.xpath('//div[@class = "links"]/a/text()').extract()

มันจะแสดงองค์ประกอบเป็น -

Link 1
Link 2
Link 3

หากคุณต้องการแยกองค์ประกอบแรกให้ใช้วิธีการ .extract_first()แสดงดังนี้ -

>>response.xpath('//div[@class = "links"]/a/text()').extract_first()

มันจะแสดงองค์ประกอบเป็น -

Link 1

ตัวเลือกการทำรัง

เมื่อใช้รหัสด้านบนคุณสามารถซ้อนตัวเลือกเพื่อแสดงลิงก์ของหน้าและแหล่งที่มาของภาพโดยใช้ไฟล์ .xpath() วิธีการแสดงดังนี้ -

links = response.xpath('//a[contains(@href, "image")]') 

for index, link in enumerate(links): 
   args = (index, link.xpath('@href').extract(), link.xpath('img/@src').extract()) 
   print 'The link %d pointing to url %s and image %s' % args

มันจะแสดงผลลัพธ์เป็น -

Link 1 pointing to url [u'one.html'] and image [u'image1.jpg']
Link 2 pointing to url [u'two.html'] and image [u'image2.jpg']
Link 3 pointing to url [u'three.html'] and image [u'image3.jpg']

ตัวเลือกที่ใช้นิพจน์ทั่วไป

Scrapy ช่วยให้สามารถดึงข้อมูลโดยใช้นิพจน์ทั่วไปซึ่งใช้ไฟล์ .re()วิธี. จากโค้ด HTML ด้านบนเราจะแยกชื่อรูปภาพที่แสดงดังนี้ -

>>response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')

บรรทัดด้านบนแสดงชื่อภาพเป็น -

[u'Link 1', 
u'Link 2', 
u'Link 3']

การใช้ Relative XPaths

เมื่อคุณทำงานกับ XPaths ซึ่งเริ่มต้นด้วย /ตัวเลือกที่ซ้อนกันและ XPath เกี่ยวข้องกับพา ธ สัมบูรณ์ของเอกสารไม่ใช่เส้นทางสัมพัทธ์ของตัวเลือก

หากคุณต้องการแยกไฟล์ <p> องค์ประกอบจากนั้นรับองค์ประกอบ div ทั้งหมดก่อน -

>>mydiv = response.xpath('//div')

ถัดไปคุณสามารถแยกไฟล์ 'p' องค์ประกอบภายในโดยนำหน้า XPath ด้วยจุดเป็น .//p ดังแสดงด้านล่าง -

>>for p in mydiv.xpath('.//p').extract()

การใช้ EXSLT Extensions

EXSLT เป็นชุมชนที่ออกส่วนขยายไปยัง XSLT (Extensible Stylesheet Language Transformations) ซึ่งแปลงเอกสาร XML เป็นเอกสาร XHTML คุณสามารถใช้นามสกุล EXSLT กับเนมสเปซที่ลงทะเบียนไว้ในนิพจน์ XPath ดังแสดงในตารางต่อไปนี้ -

ซีเนียร์ No คำนำหน้าและการใช้งาน เนมสเปซ
1

re

นิพจน์ทั่วไป

http://exslt.org/regexp/index.html

2

set

ตั้งค่าการจัดการ

http://exslt.org/set/index.html

คุณสามารถตรวจสอบรูปแบบโค้ดอย่างง่ายสำหรับการแยกข้อมูลโดยใช้นิพจน์ทั่วไปในส่วนก่อนหน้า

มีเคล็ดลับ XPath บางอย่างซึ่งมีประโยชน์เมื่อใช้ XPath กับตัวเลือก Scrapy สำหรับข้อมูลเพิ่มเติมคลิกลิงค์นี้