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

2024-05-15 07:11:58 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们有一个如下所示的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>

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

预期结果:

^{2}$

Tags: srctxtimgxmlaltgifprejan
3条回答

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。在

^{pr2}$

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

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

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

could you please explain me str(a.text).strip().lower().endswith('jpg')? – guava

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

thank you @Paulo Scardine i also could not understand re.findall(r'<a href="(.+?)">', – guava

好吧,re模块是regular expressions的Python实现——这是一个庞大的主题,有比圣经更大的书(好吧,也许比新约全书还要大)。我不会假装我能在一个stackoverflow答案中触及它的表面。在

首先你会发现奇怪的是引号前面的r。它是一个raw string literal,一个你不必转义\的字符串,因为与正则字符串不同,反斜杠在原始字符串中没有特殊的含义(在正则表达式中经常使用反斜杠,我突然想到我在本例中没有使用带反斜杠的模式-习惯的力量…)

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

我希望此正则表达式正确概括:

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)

希望这有帮助

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

您可以使用类似于:

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

要在当前列表中查找任何jpg文件,但如果文件名有.,则必须修改regex。在

如果不需要重复项,可以将其包装在一个集合中,例如:

^{pr2}$

正则表达式说明:

[a-zA-z0-9]+

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

\.jpg

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

[^\.]

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

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

相关问题 更多 >