2011-06-22 9 views
1

URLがbrタグで区切られたhtmlファイルがあります。不正な形式のbrタグでの解析解析の問題

<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'] 

結果:あなたはCrawlSpiderでこのメソッドを使用したい場合は

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

だから、あなただけの単純な(または複素数)を記述する必要が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です。はい、あなたは正しいですが、これはまた、治療コードベースで修正される必要があります。 – Medorator

-1

ちょうど、代わりに<br/>タグの<br>タグを使用することを使用します。詳細な例については、

+2

自分が所有していないサイトのウェブページを編集するにはどうすればよいですか? – Medorator