2016-02-09 12 views
14

Tôi đang cố gắng loại bỏ \ r \ n \ t ký tự bằng một con nhện bị rách, sau đó tạo một tệp json.Dải n t r trong scrapy

Tôi có một đối tượng "mô tả" có đầy đủ các dòng mới và nó không làm những gì tôi muốn: khớp từng mô tả với một tiêu đề.

Tôi đã thử với bản đồ (unicode.strip()) nhưng nó không thực sự hoạt động. Là mới để cạo tôi không biết nếu có một cách đơn giản hơn hoặc làm thế nào bản đồ unicode thực sự hoạt động.

Đây là mã của tôi:

def parse(self, response): 
    for sel in response.xpath('//div[@class="d-grid-main"]'): 
     item = xItem() 
     item['TITLE'] = sel.xpath('xpath').extract() 
     item['DESCRIPTION'] = map(unicode.strip, sel.xpath('//p[@class="class-name"]/text()').extract()) 

Tôi cũng thử với:

item['DESCRIPTION'] = str(sel.xpath('//p[@class="class-name"]/text()').extract()).strip() 

Nhưng nó nhướn lỗi. Cách tốt nhất là gì?

+0

Xin chào, ý bạn là "nó không thực sự hoạt động"? 'strip()' chỉ xem xét các ký tự đầu và cuối, vì vậy nếu bạn muốn loại bỏ bất kỳ thứ gì bên trong chuỗi, bạn cần một cách khác. 'import re' và' re.sub ('[\ r \ n \ t]', '', 'Hel \ nlo \ r!') 'có thể giúp nếu đó là vấn đề của bạn. –

+0

Tôi khuyên bạn nên kiểm tra 'ItemLoader' s http://doc.scrapy.org/en/latest/topics/loaders.html cho phép bạn quản lý đầu vào và đầu ra của 'Item's – Granitosaurus

+0

QuentinPradet cảm ơn, trên thực tế paul's câu trả lời là tốt, tôi không biết điều đó. Và Granitosaurus Tôi sẽ nghiên cứu cảm ơn –

Trả lời

13

unicode.strip chỉ giao dịch với nhân vật khoảng trắng ở đầu và cuối chuỗi

Return một bản sao của chuỗi với các ký tự ở đầu và đuôi gỡ bỏ.

không phải với \n, \r hoặc \t ở giữa.

Bạn có thể sử dụng một phương pháp tùy chỉnh để loại bỏ những ký tự bên trong chuỗi (bằng cách sử dụng mô-đun biểu thức chính quy), hoặc thậm chí sử dụng XPath's normalize-space()

trả về chuỗi cãi nhau với khoảng trắng bình thường bằng cách tách hàng đầu và dấu khoảng trắng và thay thế chuỗi ký tự khoảng trắng bằng một khoảng trắng.

Ví dụ phiên python shell:

>>> text='''<html> 
... <body> 
... <div class="d-grid-main"> 
... <p class="class-name"> 
... 
... This is some text, 
... with some newlines \r 
... and some \t tabs \t too; 
... 
... <a href="http://example.com"> and a link too 
... </a> 
... 
... I think we're done here 
... 
... </p> 
... </div> 
... </body> 
... </html>''' 
>>> response = scrapy.Selector(text=text) 
>>> response.xpath('//div[@class="d-grid-main"]') 
[<Selector xpath='//div[@class="d-grid-main"]' data=u'<div class="d-grid-main">\n<p class="clas'>] 
>>> div = response.xpath('//div[@class="d-grid-main"]')[0] 
>>> 
>>> # you'll want to use relative XPath expressions, starting with "./" 
>>> div.xpath('.//p[@class="class-name"]/text()').extract() 
[u'\n\n This is some text,\n with some newlines \r\n and some \t tabs \t too;\n\n', 
u"\n\nI think we're done here\n\n"] 
>>> 
>>> # only leading and trailing whitespace is removed by strip() 
>>> map(unicode.strip, div.xpath('.//p[@class="class-name"]/text()').extract()) 
[u'This is some text,\n with some newlines \r\n and some \t tabs \t too;', u"I think we're done here"] 
>>> 
>>> # normalize-space() will get you a single string on the whole element 
>>> div.xpath('normalize-space(.//p[@class="class-name"])').extract() 
[u"This is some text, with some newlines and some tabs too; and a link too I think we're done here"] 
>>> 
+0

Tôi muốn bình thường hóa toàn bộ không gian: response.xpath ('.'). Extract() Công trình này, nhưng sử dụng bình thường hóa không gian: response.xpath ('normalize-space (.) '). Trích xuất() các thẻ html như bị xóa, tại sao? – Baks

+0

@Baks, ['bình thường hóa không gian (.)'] (Https://www.w3.org/TR/xpath/#function-normalize-space) trả về giá trị chuỗi [bình thường hóa không gian] (https: // www.w3.org/TR/xpath/#element-nodes) của nút ngữ cảnh, là một kết nối của các nút văn bản con cháu: _ "Chuỗi giá trị của nút phần tử là kết nối của chuỗi-giá trị của tất cả văn bản nút con của nút phần tử theo thứ tự tài liệu. "_ –

4

Như paul trmbrth gợi ý in his answer,

div.xpath('normalize-space(.//p[@class="class-name"])').extract() 

có khả năng là những gì bạn muốn. Tuy nhiên, normalize-space cũng ngưng tụ khoảng trắng chứa trong chuỗi thành một dấu cách. Nếu bạn chỉ muốn xóa \r, \n\t mà không làm phiền các khoảng trống khác, bạn có thể sử dụng translate() để xóa ký tự.

trans_table = {ord(c): None for c in u'\r\n\t'} 
item['DESCRIPTION] = ' '.join(s.translate(trans_table) for s in sel.xpath('//p[@class="class-name"]/text()').extract()) 

này vẫn sẽ rời khỏi hàng đầu và dấu khoảng trắng đó không phải là trong tập \r, \n, hoặc \t. Nếu bạn cũng muốn được thoát khỏi mà chỉ cần chèn một cuộc gọi đến strip():

item['DESCRIPTION] = ' '.join(s.strip().translate(trans_table) for s in sel.xpath('//p[@class="class-name"]/text()').extract()) 
+0

Hoàn hảo. Tôi không bao giờ biết về điều này và nó giải quyết tất cả các vấn đề khoảng trắng của tôi mà không có regexes. – Echelon

+0

div.xpath ('bình thường hóa-không gian (.// p [@ class = "tên lớp"])'). Trích xuất() làm việc cho tôi, cảm ơn. –

3

tôi một con trăn, scrapy newbie, tôi đã có một vấn đề tương tự ngày hôm nay, giải quyết điều này với sự giúp đỡ của các mô-đun sau/function w3lib.html.replace_escape_chars Tôi đã tạo bộ xử lý đầu vào mặc định cho trình tải mục của tôi và nó hoạt động mà không có bất kỳ sự cố nào, bạn có thể liên kết bộ lọc này trên mẩu tin lưu niệm cụ thể.Trường() cũng có, và điều tốt nó hoạt động với các bộ chọn css và xuất khẩu nguồn cấp dữ liệu csv:

from w3lib.html import replace_escape_chars 
yourloader.default_input_processor = MapCompose(relace_escape_chars) 
Các vấn đề liên quan