2011-06-22 7 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