0

Pythonを使用してWebページのHTMLを取得しましたが、ヘッダーでリンクされているすべての.CSSファイルを検索したいと思います。以下に示すようにパーティション分割を試みましたが、実行時に「IndexError:文字列インデックスが範囲外です」というエラーが発生し、それぞれを独自の変数として保存しました(この部分の実行方法を知っています)。

sytle = src.partition(".css")
style = style[0].partition('<link href=')
print style[2]
c =1

これがこれにアプローチする正しい方法だとは思わないので、アドバイスをお願いします。よろしくお願いします。これは、.CSSファイルを抽出するために必要な種類のテキストのセクションです。

    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0" />

<!--[if gte IE 7]><!-->
<link href="/stylesheets/master.css?1342791430" media="screen, projection" rel="stylesheet" type="text/css" />

<link href="/stylesheets/adapt.css?1342791413" media="screen, projection" rel="stylesheet" type="text/css" />
<!-- <![endif]-->
<link href="/stylesheets/print.css?1342791421" media="print" rel="stylesheet" type="text/css" />
<link href="/apple-touch-icon-precomposed.png" rel="apple-touch-icon-precomposed" />
<link href="http://dribbble.com/shots/popular.rss" rel="alternate" title="RSS" type="application/rss+xml" />

4

3 に答える 3

4

これには正規表現を使用する必要があります。次のことを試してください。

/href="(.*\.css[^"]*)/g

編集

import re
matches = re.findall('href="(.*\.css[^"]*)', html)
print(matches)
于 2012-07-26T21:55:19.733 に答える
2

私の答えはJonClementsの答えと同じですが、私は自分の答えをテストし、説明を追加しました。

正規表現は使用し ないでください。正規表現を使用してHTMLを解析することはできません。正規表現の答えは機能するかもしれませんが、 lxmlを使用すると、堅牢なソリューションを作成するのは非常に簡単です。このアプローチでは、すべてのタグの完全なhref属性が返され、他のタグは返されないことが保証されて<link rel="stylesheet">います。

from lxml import html

def extract_stylesheets(page_content):
    doc = html.fromstring(page_content)                        # Parse
    return doc.xpath('//head/link[@rel="stylesheet"]/@href')   # Search

xpath検索の結果はすでにスタイルシートリンクであることがわかっているため、ファイル名を確認する必要はありません。また、ファイル名に拡張子が付けられる保証はありませ.cssん。単純な正規表現は非常に特定の形式のみをキャッチしますが、一般的なhtmlパーサーソリューションは、正規表現が惨めに失敗するこのような場合にも正しいことを行います。

<link REL="stylesheet" hREf = 

     '/stylesheets/print?1342791421'
  media="print"
><!-- link href="/css/stylesheet.css" -->

また、特定のメディアのスタイルシートのみを選択するように簡単に拡張することもできます。

于 2013-09-29T21:24:08.257 に答える
1

解析ライブラリとして(lxml.htmlを使用して)価値があるものについて。

テストされていません

import lxml.html
from urlparse import urlparse

sample_html = """<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0" />

<!--[if gte IE 7]><!-->
<link href="/stylesheets/master.css?1342791430" media="screen, projection" rel="stylesheet" type="text/css" />

<link href="/stylesheets/adapt.css?1342791413" media="screen, projection" rel="stylesheet" type="text/css" />
<!-- <![endif]-->
<link href="/stylesheets/print.css?1342791421" media="print" rel="stylesheet" type="text/css" />
<link href="/apple-touch-icon-precomposed.png" rel="apple-touch-icon-precomposed" />
<link href="http://dribbble.com/shots/popular.rss" rel="alternate" title="RSS" type="application/rss+xml" />
"""

import lxml.html
page = lxml.html.fromstring(html)
link_hrefs = (p.path for p in map(urlparse, page.xpath('//head/link/@href')))
for href in link_hrefs:
    if href.rsplit(href, 1)[-1].lower() == 'css': # implement smarter error handling here
        pass # do whatever
于 2012-07-26T22:29:36.467 に答える