2017-01-29 13 views
2

scrapy allow all subdomainsのほぼ重複しています!許可されたドメインごとに、フィルタリング結果がフィルタリングされません。

注:最初はすべて私はScrapyを新しくしました&私はthisの質問にコメントするには十分な評判がありません。だから、私は新しいものを尋ねることにしました!

問題文:

私は特定のウェブサイトからの電子メールアドレスをスクラップするBeautifulSoupを使用していました。特定のページ(つまりexample.com)でメールアドレスが利用可能な場合は正常に動作していますが、ご利用いただけない場合はexample.com/contact-usでご利用いただけます。

そのため、私はScrapyを使用することに決めました。私はallowed_domains を使用してドメイン関連のリンクのみを取得していますが、オフサイトのリンクもすべて提供しています。そして、私は@agstudyによって提案された別のアプローチを試みました。this質問でSgmlLinkExtractorをルールに使用しました。

その後

私はこのエラーを得た、

Traceback (most recent call last):  
    File "/home/msn/Documents/email_scraper/email_scraper/spiders/emails_spider.py", line 14, in <module> 
     from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
    File "/home/msn/Documents/scrapy/lib/python3.5/site-packages/scrapy/contrib/linkextractors/sgml.py", line 7, in <module> 
     from scrapy.linkextractors.sgml import * 
    File "/home/msn/Documents/scrapy/lib/python3.5/site-packages/scrapy/linkextractors/sgml.py", line 7, in <module> 
     from sgmllib import SGMLParser 
ImportError: No module named 'sgmllib' 
基本的に

、はImportErrorは、Python 3.xではsgmlibの廃止(単純なSGMLパーサ)についてです私はきたもの

これまでに試した:

class EmailsSpiderSpider(scrapy.Spider): 
    name = 'emails' 
    # allowed_domains = ['example.com'] 
    start_urls = [ 
     'http://example.com/' 
    ] 

    rules = [ 
     Rule(SgmlLinkExtractor(allow_domains=("example.com"),), callback='parse_url'), 
    ] 

    def parse_url(self, response): 
     hxs = HtmlXPathSelector(response) 
     urls = hxs.select("//a/@href").extract() 
     print(set(urls)) # sanity check 

また、CrawlSpiderでLxmlLinkExtractorを試しましたが、依然としてオフサイトリンクを取得しました。

これを行うにはどうすればよいですか?または問題を解決する私の方法は間違っていますか?

助けていただけたら幸いです!

別注: たびウェブサイトは、電子メールをスクラップして異なるだろう。だから、特定のHTMLセレクタやCSSセレクタを使用することはできません!

答えて

1

は、あなたはあなたがオフサイトも含め、正確にすべてのリンクを取得するページ上のすべてのaタグからエキスhref属性値を意味hxs.select('//a/@href')でXPath式を使用します。あなたが代わりに使用することができますことはLinkExtractorあり、それはこのようになります:LinkExtractorは本当にために作られているもの

from scrapy.linkextractors import LinkExtractor 

def parse_url(self, 
    urls = [l.url for l in LinkExtractor(allow_domains='example.com').extract_links(response)] 
    print(set(urls)) # sanity check 

は(私は推測します)。ところで

、@mizhgun、あなたが(StackOverflowのを含む)は、インターネットで見つけることができる最もScrapyの例は、それが働いたのPython 3

+0

との完全な互換性を持っていない以前のバージョンと呼ばれているに注意してください!ありがとう! – Mohsin

関連する問題