如何使用python在文本块中找到文件名?

时间:2012-07-26 21:48:02

标签: python file parsing text

我已经使用Python获取了网页的HTML,现在我想找到标题中链接到的所有.CSS文件。我尝试了分区,如下所示,但是在运行它时出现错误“IndexError:string index out of range”并将每个保存为自己的变量(我知道如何做这部分)。

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" />

3 个答案:

答案 0 :(得分:5)

您应该使用regular expression。请尝试以下方法:

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

修改

import re
matches = re.findall('href="(.*\.css[^"]*)', html)
print(matches)

答案 1 :(得分:2)

我的答案与Jon Clements' answer的答案相同,但我测试了我的答案并添加了一些解释。

你应该使用正则表达式。 You can't parse HTML with a regex。正则表达式的回答可能有效,但使用lxml编写健壮的解决方案非常容易。保证此方法返回所有<link rel="stylesheet">标记的完整href属性,而不返回其他标记。

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" -->

也可以轻松扩展为仅选择特定媒体的样式表。

答案 2 :(得分: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