0

假设我们有一个 HTML 文件,如下所示:

    </pre>
    <pre><img src="/icons/blank.gif" alt="Icon "> <a href="?C=N;O=D">Name</a>
    <img src="/icons/unknown.gif" alt="[   ]"> <a href="AAAAAAA.jpg">AAAAAAA.jpg</a>          16-Jan-2008 01:27  827K  
    <img src="/icons/unknown.gif" alt="[   ]"> <a href="AAAAAAA.jpg.xml">AAAAAAA.jpg.xml</a>      16-Jan-2008 01:28   12K
    <img src="/icons/image2.gif" alt="[IMG]"> <a href="BBBBB.AAAAAAAA.txt">BBBBB.AAAAAAAA.txt</a> 16-Jan-2008 15:01  1.6K  
    <img src="/icons/unknown.gif" alt="[   ]"> <a href="js421254.jpg">AAAAAAA.jpg</a>          16-Jan-2008 01:27  827K  
    <img src="/icons/unknown.gif" alt="[   ]"> <a href="js421254.jpg.xml">AAAAAAA.jpg.xml</a>      16-Jan-2008 01:28   12K
    ...
    ...
    ...
    <img src="/icons/image2.gif" alt="[IMG]"> <a href="BBdBBB.AAAAsaAAAA.txt">BBBBB.AAAAAAAA.txt</a> 16-Jan-2008 15:01  1.6K  
    <img src="/icons/unknown.gif" alt="[   ]"> <a href="52542.jpg">AAAAAAA.jpg</a>          16-Jan-2008 01:27  827K  
    <img src="/icons/unknown.gif" alt="[   ]"> <a href="52542.jpg.xml">AAAAAAA.jpg.xml</a>      16-Jan-2008 01:28   12K
    <hr></pre>
    </body></html>

如何创建一个包含如下字符的新文本文件:

预期结果:

AAAAAAA.jpg
js421254.jpg
...
...
...
52542.jpg
4

3 回答 3

0

我希望这个正则表达式能正确概括:

with open('path/to/file') as infile, open('/path/to/output', 'w') as outfile:
    for line in infile:
        if line.startswith('lt="[   ]"'):
            hrefs = re.findall("\<a\\s+href=.*\</a\>?", line)
            for href in hrefs:
                target = href.split('=', 1)[1].split(">", 1)[0].strip('"')
                outfile.write("%s\n" target)

希望这可以帮助

于 2013-07-23T00:33:52.343 回答
0

BeautifulSoup非常适合网页抓取:

from BeautifulSoup import BeautifulSoup

soup = BeautifulSoup("""<img src="/icons/blank.gif" alt="Icon ">
    <a href="?C=N;O=D">Name</a>
    <img src="/icons/unknown.gif" alt="[   ]">
    <a href="AAAAAAA.jpg">AAAAAAA.jpg</a>          16-Jan-2008 01:27  827K
    <img src="/icons/unknown.gif" alt="[   ]">
    <a href="AAAAAAA.jpg.xml">AAAAAAA.jpg.xml</a>      16-Jan-2008 01:28   12K
    <img src="/icons/image2.gif" alt="[IMG]">
    <a href="BBBBB.AAAAAAAA.txt">BBBBB.AAAAAAAA.txt</a> 16-Jan-2008 15:01  1.6K
    <img src="/icons/unknown.gif" alt="[   ]">
    <a href="js421254.jpg">AAAAAAA.jpg</a>          16-Jan-2008 01:27  827K
    <img src="/icons/unknown.gif" alt="[   ]">
    <a href="js421254.jpg.xml">AAAAAAA.jpg.xml</a>      16-Jan-2008 01:28   12K""")

>>> for a in soup.findAll('a'):
...     if str(a.text).strip().lower().endswith('jpg'): print a.text
...
AAAAAAA.jpg
AAAAAAA.jpg
>>>
>>> for a in soup.findAll('a'):
...     if a.get('href').strip().lower().endswith('jpg'): print a.get('href')
... 
AAAAAAA.jpg
js421254.jpg

如果你想要纯 Python 并且你的用例足够简单,你可以尝试正则表达式。这比较棘手,因为在现实世界中存在很多极端情况和格式错误的 HTML。

import re
>>> for match in re.findall(r'<a .+?>(.+?)</a>', html):
...     if match.strip().lower().endswith('jpg'): print match
...     
AAAAAAA.jpg
AAAAAAA.jpg
>>> 

或者,如果您正在查看 href 属性:

>>> for match in re.findall(r'<a href="(.+?)">', html):
...     if match.lower().endswith('jpg'): print match
... 
AAAAAAA.jpg
js421254.jpg

如果你只是抓取一些简单的东西,比如色情网站,你应该用正则表达式得到很好的结果。

你能解释一下 str(a.text).strip().lower().endswith('jpg') 吗?– 番石榴

  • strip:此方法返回的字符串没有出现在字符串开头或结尾的空格(包括制表符和换行符)
  • lower:转换为小写(因此您不需要测试所有大小写变体,如 JPG、jpg、Jpg)。
  • endswith:如果字符串以您提供的参数(您正在寻找的东西)结尾,则返回 True。

谢谢@Paulo Scardine,我也听不懂re.findall(r'<a href="(.+?)">',-番石榴

嗯,re 模块是正则表达式的 Python 实现——一个庞大的主题,其中的书籍比圣经还大(好吧,可能比新约还大)。我不会假装我可以在 stackoverflow 答案中抓住它的表面。

您可能会觉得奇怪的第一件事是r引号前面。它是一个原始字符串文字,一个您不必转义的\字符串,因为与常规字符串不同,反斜杠在原始字符串中没有特殊含义(反斜杠在正则表达式中一直使用,我突然想到我在这种情况下,我不使用带有反斜杠的模式 - 习惯的力量......)

现在到表达式:()标记您要捕获的组。点表示任何字符,加号表示其中的一个或多个,并且?表示搜索不是贪婪的(默认是贪婪搜索,其中.+匹配任何字符,包括引号)。只需尝试不带 the 的相同表达式?,您就会明白会发生什么。

于 2013-07-23T00:37:09.273 回答
0

您可以使用正则表达式进行简单的解析,但这完全取决于您到底想要什么。

你可以使用类似的东西:

<t = html text>
import re
for f in re.findall('([a-zA-Z0-9]+\.jpg)[^\.]',t):
    print f

在当前列表中查找任何 jpg 文件,但如果文件名具有 a.那么您将不得不修改正则表达式。

如果您不想重复,可以将其包装在一组中,例如:

for f in set(re.findall('([a-zA-Z0-9]+\.jpg)[^\.]',t)):

正则表达式的解释:

[a-zA-z0-9]+

这将选择一个或多个字符的任何序列,即字母或数字。

\.jpg

这将选择确切的字符串.jpg

[^\.]

这意味着下一个字符不能.

除了最后一部分之外的所有内容的括号是正则表达式选择的所有内容。

于 2013-07-23T00:37:26.523 回答