从HTML文件中提取一些数据并将其写入另一个文件

时间:2013-07-23 00:17:57

标签: python python-2.7 python-3.x

鉴于我们有一个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

3 个答案:

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

希望这有帮助

答案 1 :(得分: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 :此方法返回字符串开头或结尾处不带空格(包括制表符和换行符)的字符串
  • 更低:转换为小写(因此您无需测试所有案例变体,如JPG,jpg,Jpg)。
  • endswith :如果字符串以您提供的参数结束(您要查找的内容),则返回True。
  

谢谢@Paulo Scardine我也无法理解re.findall(r'<a href="(.+?)">', - 番石榴

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

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

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

答案 2 :(得分:0)

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

您可以使用以下内容:

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

在当前列表中查找任何jpg文件,但如果文件名为.,则必须修改正则表达式。

如果您不想复制,可以将其包装在以下集合中:

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

正则表达式的解释:

[a-zA-z0-9]+

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

\.jpg

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

[^\.]

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

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