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 สำหรับข้อมูลเพิ่มเติมคลิกลิงค์นี้