2014-02-13 21 views
0

因此,我試圖抓取popular.ebay.com頁面,並獲得#anchor鏈接的error:Missing scheme in request url: #mainContentScrapy:skip hrefs w/missing scheme

下面是我的代碼:

def parse_links(self, response): 
    hxs = HtmlXPathSelector(response) 
    links = hxs.select('//a') 
    #domain = 'http://popular.ebay.com/' 
    for link in links: 
     anchor_text = ''.join(link.select('./text()').extract()) 
     title = ''.join(link.select('./@title').extract()) 
     url = ''.join(link.select('./@href').extract()) 
     meta = {'title':title,} 
     meta = {'anchor_text':anchor_text,} 
     yield Request(url, callback = self.parse_page, meta=meta,) 

我可以基本URL不會增加#mainContent,因爲它增加了一個雙網址的URL與完整的URL方案。我最終得到的URL這樣http://popular.ebay.comhttp://www.ebay.com/sch/i.html?_nkw=grande+mansion

def parse_links(self, response): 
    hxs = HtmlXPathSelector(response) 
    links = hxs.select('//a') 
    #domain = 'http://popular.ebay.com/' 
    for link in links: 
     anchor_text = ''.join(link.select('./text()').extract()) 
     title = ''.join(link.select('./@title').extract()) 
     url = ''.join(link.select('./@href').extract()) 
     meta = {'title':title,} 
     meta = {'anchor_text':anchor_text,} 
     yield Request(response.url, callback = self.parse_page, meta=meta,) 

我想是這樣的鏈接:<a href="http://popular.ebay.com/antiques/antique-chair/antique-chairs.htm" title="Antique Chairs">Antique Chairs | </a>,但我得到的鏈接這樣的錯誤原因:<a id="gh-hdn-stm" class="gh-acc-a" href="#mainContent">Skip to main content</a>

我怎麼會去加入鹼只有鏈接到哈希錨鏈接,或忽略沒有在其中的基礎網址的鏈接?對於簡單的解決方案,我嘗試了設置規則deny=(#mainContent)restrict_xpaths,但抓取工具仍然出現相同的錯誤。

回答

1

error:Missing scheme in request url: #mainContent是由於請求沒有方案的url(url的「http://」部分)而導致的。

#mainContent是一個內部鏈接,引用一個id爲「mainContent」的HTML元素。您可能不想遵循這些鏈接,因爲它只鏈接到當前頁面的不同部分。

我會建議看看這部分的文檔http://doc.scrapy.org/en/latest/topics/link-extractors.html#scrapy.contrib.linkextractors.sgml.SgmlLinkExtractor。您可以告訴Scrapy遵循符合特定格式的鏈接,並限制將從中獲取鏈接的頁面的哪一部分。記下「restrict_xpaths」和「allow」參數。

希望這有助於:)

+0

是的,我明白錯誤來自哪裏,我試着設置拒絕規則和restrict_xpaths,但它仍然有相同的錯誤。我不能使用允許,除非我寫出我試圖抓取的每個url類別。 –

+0

允許可以採取正則表達式,你可以構造一些正則表達式來忽略以「#」開頭的鏈接:) – Toby

+0

我不知道正則表達式可以忽略!多麼好的解決方法!讓我嘗試一下並回復你,謝謝! –

1

在你for循環:

meta = {'anchor_text':anchor_text,} 
url = link.select('./@href').extract()[0] 
if not '#' in url: // or if url[0] != '#' 
    yield Request(response.url, callback = self.parse_page, meta=meta,) 

這將避免產生#foobar作爲URL。您可以在else聲明中將基礎網址添加到#foobar,但由於這將重定向到一個頁面,scrapy已經被刪除了,我不認爲它有一點意義。

0

我發現缺少方案的#mainContent以外的鏈接,所以使用@ Robin的邏輯我確保url在parse_page之前包含基礎url。

for link in links: 
     anchor_text = ''.join(link.select('./text()').extract()) 
     title = ''.join(link.select('./@title').extract()) 
     url = ''.join(link.select('./@href').extract()) 
     meta = {'title':title,} 
     meta = {'anchor_text':anchor_text,} 
     if domain in url: 
      yield Request(url, callback = self.parse_page, meta=meta,)