2016-09-20 25 views
0

私はScrapyを使用してクローラを構築しています。私は特定のHTML要素に割り当てられたフォントファミリを取得する必要があります。(Scrapy)HTML要素のCSSルールを取得する方法は?

のには、次が含まれているCSSファイル、Styles.cssをがあるとしましょう:

p { 
    font-family: "Times New Roman", Georgia, Serif; 
} 

そして、HTMLページに次のようにテキストがある:

<p>Hello how are you?</p> 

私のためにその簡単Scrapyを使用してテキストを抽出するために、私はまた、適用されたフォントファミリーを知りたいですこんにちは。

私はこれが(仮想XPATH)/p[font-family]などの単純なケースであると考えています。

どうすればいいですか?

あなたの考えをありがとう。

+0

CSSはあなたがtinycss、あるいは正規表現を使用することができます解析するための個人的には、それはScrapyによって処理できるものだとは思わない:(HTMLレンダラーのようなものを調べる必要があるかもしれない。 – starrify

+0

https://pythonhosted.org/tinycss/をご覧になれます –

答えて

1

cssを別々にダウンロードして解析する必要があります。

import tinycss 
class MySpider(Spider): 
    name='myspider' 
    start_urls = [ 
     'http://some.url.com' 
    ] 
    css_rules = {} 

def parse(self, response): 
    # find css url and parse it 
    css_url = response.xpath("").extract_first() 
    yield Request(css_url, self.parse_css) 

def parse_css(self, response): 
    parser = tinycss.make_parser() 
    stylesheet = parser.parse_stylesheet(response.body) 
    for rule in stylesheet.rules: 
     if not getattr(rule, 'selector'): 
      continue 
     path = rule.selector.as_css() 
     css = [d.value.as_css() for d in rule.declarations] 
     self.css_rules[path] = css 

は今、あなたはあなたには、いくつかの値を割り当てるために、あなたのクモの要求チェーンの後半で使用できるCSSのパスとその属性を持つ辞書を持っている:

def parse_item(self, response): 
    item = {} 
    item['name'] = response.css('div.name').extract_first() 
    name_css = [] 
    for k,v in css_rules.items(): 
     if 'div' in k and '.name' in k: 
      name_css.append(v) 
    item['name_css'] = name_css 
+0

あなたの返信ありがとうページに複数のCSSファイル(Bootstrap、Normalizeなど)があり、これらのファイル(たとえば)に複数のst p要素のylingは、ページ上のp要素で使用されている実際のp CSSスタイリングをコードが選択するか、CSSファイル内の未使用のp CSSスタイリングを選択しますか?例として、多くのCSSファイルを作成してpの複数のスタイルエントリを持つことができますが、ページのHTMLはネストや他のCSSルールのためにpスタイルのうちの1つしか使用しないかもしれません。 –

+0

AFAIK htmlはどのCSSを使用しているかを指定しなければならないので、それを選択して解析するだけです。私。スタックオーバーフローのためには、 'response.xpath(" // link ['rel =' stylesheet ']/@ href ")経由で見つけることができます。複数のCSSファイルを複数持つ場合は、複数のCSSファイルを使用するので、それらのすべてがあなた自身の辞書や一種の木を生み出します。 – Granitosaurus

+0

ありがとうございます。私はそれを理解するためにあなたのソリューションについて考える必要があります。私はあなたにどちらかの方法で戻ってきます! –

関連する問題