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

Python 如果我';我在HTML文件中查找字符串,我应该将其作为字符串处理,还是使用类似BeautifulSoup的包?,python,html,parsing,Python,Html,Parsing,我有一千个类似的HTML页面 对于每个HTML页面,我想下载HTML页面中链接的PDF文件。源代码显示所有这些链接都出现在这两个文本块之间:。我只需要添加一些额外的文本,对于每个链接,这些额外的文本都是相同的 例如,如果HTML文档包含,我需要提取/ppp/projManage/perview.do?文件名=安康高新区世纪大道物有所值分析5.pdf&ftpFileName=20160509120519529.pdf,并添加http://www.cpppc.org:8082/efmisweb/前面

我有一千个类似的HTML页面

对于每个HTML页面,我想下载HTML页面中链接的PDF文件。源代码显示所有这些链接都出现在这两个文本块之间:
。我只需要添加一些额外的文本,对于每个链接,这些额外的文本都是相同的

例如,如果HTML文档包含
,我需要提取
/ppp/projManage/perview.do?文件名=安康高新区世纪大道物有所值分析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文件,这些库还可以查找子字符串


哪种方法可能更快?

您应该使用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')

BeautifulSoup教程:

您应该使用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')

BeautifulSoup教程:

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

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.parser
    60秒
  • 使用BeautifulSoup和lxml解析器42秒
  • 3秒,只需lxml
  • 0.0417秒,带字符串操作
下载一个页面需要2.27秒,因此,以每秒两次并发下载的合理速率限制,下载所有页面大约需要19分钟

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


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

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

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.parser
    60秒
  • 使用BeautifulSoup和lxml解析器42秒
  • 3秒,只需lxml
  • 0.0417秒,带字符串操作
下载一个页面需要2.27秒,因此,以每秒两次并发下载的合理速率限制,下载所有页面大约需要19分钟

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


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

我认为这是一次性的?你下载了这些PDF然后就再也不用这个程序了?如果是这样的话,正则表达式可能比BeatifulSoup或HTMLPasser更容易使用,特别是因为您已经确定了可以用来提取URL的模式。另外,我向上帝发誓,如果有人链接到“不要用正则表达式解析HTML”的帖子,我会告诉他们“解析”是什么意思,以及它与提取文本有什么不同。我想这是一次性的事情?你下载了这些PDF然后就再也不用这个程序了?如果是这样的话,正则表达式可能比BeatifulSoup或HTMLPasser更容易使用,特别是因为您已经确定了可以用来提取URL的模式。另外,我向上帝发誓,如果有人链接“不要用正则表达式解析HTML”帖子,我会告诉他们“解析”是什么意思,以及它与提取文本有什么不同。@wwl:如果你最终使用了BeautifulSoup,无论如何都要安装lxml。如果没有更好的安装,则BeautifulSoup默认为Python内置的
html.parser
,这使得BeautifulSoup需要60毫秒来解析每个页面。@wwl:如果最终使用了BeautifulSoup,请无论如何安装lxml。如果没有更好的安装,BeautifulSoup默认为Python内置的
html.parser
,这使得BeautifulSoup需要60毫秒来解析每个页面。