2011-06-22 33 views
1

我有一個html文件,其中包含用br分隔的網址。Scrapy解析格式不正確的問題

<a href="example.com/page1.html">Site1</a><br/> 
<a href="example.com/page2.html">Site2</a><br/> 
<a href="example.com/page3.html">Site3</a><br/> 

注意換行符標籤<br/>而不是<br />。 Scrapy能夠解析並提取第一個url,但在此之後無法提取任何內容。如果我在斜槓前面放一個空格,它可以正常工作。該html格式不正確,但我已經看到了多個網站的這個錯誤,並且由於瀏覽器能夠正確顯示它,我希望scrapy(或底層的lxml/libxml2/beautifulsoup)也應該正確解析它。

回答

3

lxml.html解析它很好。只需使用該代替捆綁的HtmlXPathSelector即可。

import lxml.html as lxml 

bad_html = """<a href="example.com/page1.html">Site1</a><br/> 
<a href="example.com/page2.html">Site2</a><br/> 
<a href="example.com/page3.html">Site3</a><br/>""" 

tree = lxml.fromstring(bad_html) 

for link in tree.iterfind('a'): 
    print link.attrib['href'] 

結果:

 
example.com/page1.html 
example.com/page2.html 
example.com/page3.html 

所以,如果你想在一個CrawlSpider使用這種方法,你只需要編寫一個簡單的(或複雜)link extractor

例如,

import lxml.html as lxml 

class SimpleLinkExtractor: 
    extract_links(self, response): 
     tree = lxml.fromstring(response.body) 
     links = tree.xpath('a/@href') 
     return links 

,然後用它在你的蜘蛛..

class MySpider(CrawlSpider): 
    name = 'example.com' 
    allowed_domains = ['example.com'] 
    start_urls = ['http://www.example.com'] 

    rules = (
     Rule(SimpleLinkExtractor(), callback='parse_item'), 
    ) 

    # etc ... 
+0

+1爲詳細的例子。是的你是對的,但這也應該在scrapy代碼庫中得到解決。 – Medorator

-1

只需使用的,而不是<br/>標籤<br>標籤,通過最新的公約的建議。

+2

如何編輯我不擁有的網站的網頁? – Medorator