如果我在HTML文件中查找字符串,我应该将其作为字符串处理,还是使用类似BeautifulSoup的包?

2024-10-02 16:28:31 发布

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

我有一千个类似于this page的HTML页面。你知道吗

对于每个HTML页面,我想下载HTML页面中链接的PDF文件。源代码显示所有这些链接出现在这两个文本块之间:<a style="color:#167bd5;font-size:13px;" href="javascript:void(0);" onclick="perviewPdf(this)" url="" target="_blank">。我只需要添加一些额外的文本,这个额外的文本对于每个链接都是一样的。你知道吗

例如,如果HTML文档包含<a style="color:#167bd5;font-size:13px;" href="javascript:void(0);" onclick="perviewPdf(this)" url="./ppp/projManage/perview.do?fileName=安康高新区世纪大道物有所值分析5.pdf&ftpFileName=20160509120519529.pdf" target="_blank">,我需要提取/ppp/projManage/perview.do?fileName=安康高新区世纪大道物有所值分析5.pdf&ftpFileName=20160509120519529.pdf,并将http://www.cpppc.org:8082/efmisweb/添加到前面,将&content=efmisweb&xsg=:8083/添加到后面。你知道吗

我需要下载的PDF文件在这里:http://www.cpppc.org:8082/efmisweb/ppp/projManage/perview.do?fileName=fileName=安康高新区世纪大道物有所值分析5.pdf&ftpFileName=20160509120519529.pdf&content=efmisweb&xsg=:8083/

我正在考虑使用Python来提取我需要的文本,然后下载文件。下载HTML文件后,我可以想到两种可能的方法:

1)将HTML文件解析为文本字符串,使用find()搜索子字符串

2)使用BeautifulSoup或HTMLParser等库解析HTML文件,这些库还可以查找子字符串。你知道吗

哪种方法可能更快?你知道吗


Tags: 文件文本pdf链接html页面filenamethis
2条回答

您应该使用BeautifulSoup解析HTML内容

下面是一个非常简单的用例示例:

from bs4 import BeautifulSoup
str='''<a style="color:#167bd5;font-size:13px;" href="javascript:void(0);" onclick="perviewPdf(this)" url="./ppp/projManage/perview.do?fileName=安康高新区世纪大道物有所值分析5.pdf&ftpFileName=20160509120519529.pdf"/>'''
soup=BeautifulSoup(str)
print soup.find_all('a')[0].get('url')

输出:

./ppp/projManage/perview.do?fileName=安康高新区世纪大道物有所值分析5.pdf&ftpFileName=20160509120519529.pdf

美团教程:http://www.pythonforbeginners.com/beautifulsoup/beautifulsoup-4-python

以下是几种方法的时间比较:

In [22]: %timeit [a.get('url') for a in BeautifulSoup(html).find_all('a', onclick='perviewPdf(this)')]
10 loops, best of 3: 59.6 ms per loop

In [23]: %timeit [a.get('url') for a in BeautifulSoup(html, 'lxml').find_all('a', onclick='perviewPdf(this)')]
10 loops, best of 3: 42.3 ms per loop

In [24]: %timeit lxml.html.fromstring(html).xpath('//a/@url')
100 loops, best of 3: 2.99 ms per loop

In [25]: %timeit [t.split('"', 1)[0] for t in html.split('perviewPdf(this)" url="')[1:]]
10000 loops, best of 3: 41.7 µs per loop

如果您已经下载了所有HTML文件,则解析1000个文件需要:

  • 使用BeautifulSoup和内置的html.parser60秒。你知道吗
  • 使用BeautifulSoup和lxml解析器需要42秒。你知道吗
  • 3秒,只需lxml。你知道吗
  • 0.0417秒,字符串操作。你知道吗

下载一个页面需要2.27秒,因此以每秒两次并发下载的合理速率限制,下载所有页面大约需要19分钟。你知道吗

虽然使用字符串操作提取url确实更快,但与下载HTML所需的19分钟相比,速度微不足道。你知道吗

就我个人而言,我会使用lxml,因为它是最简单和足够快的。使用BeautifulSoup将使脚本运行时增加约3%,但对于更复杂的HTML,使用它可能比使用XPath更容易。你知道吗

相关问题 更多 >