使用正则表达式从给定的链接列表中提取pdf链接

时间:2018-06-20 05:47:45

标签: python regex python-3.x pdf

我有一个存储为LIST的链接列表。但是我只需要提取PDF链接。

    links = [ '<a class="tablebluelink" href="https://www.samplewebsite.com/xml-data/abcdef/higjkl/Thisisthe-required-document-b4df-16t9g8p93808.pdf" target="_blank"><img alt="Download PDF" border="0" src="../Include/images/pdf.png"/></a>', '<a class="tablebluelink" href="https://www.samplewebsite.com/xml-data/abcdef/higjkl/Thisisthe-required-document-link-4ea4-8f1c-dd36a1f55d6f.pdf" target="_blank"><img alt="Download PDF" border="0" src="../Include/images/pdf.png"/></a>']

所以我只需要提取从“ https”开始并以pdf结尾的链接,如下所示

    https://www.samplewebsite.com/xml-data/abcdef/higjkl/Thisisthe-required-document-b4df-16t9g8p93808.pdf

并将此链接存储在列表中。变量“链接”中有许多pdf链接。需要将所有pdf链接存储在名为“ pdf_links”的变量中

有人可以建议我使用正则表达式来提取此pdf链接吗? 我使用了下面的正则表达式,但是它不起作用。

    pdf_regex = r""" (^<a\sclass="tablebluelink"\shref="(.)+.pdf"$)"""

3 个答案:

答案 0 :(得分:2)

每个人都会告诉您使用正则表达式处理HTML是错误的。我不想向您展示如何以这种方式完成操作,而是向您展示使用库(例如, BeautifulSoup 4,这是经常被推荐的。

为了使它更简单并接近您的示例代码,我仅将输入列表弄平。通常,您会将原始HTML直接提供给解析器(例如,参见here)。

from bs4 import BeautifulSoup
links = [ '<a class="tablebluelink" href="https://www.samplewebsite.com/xml-data/abcdef/higjkl/Thisisthe-required-document-b4df-16t9g8p93808.pdf" target="_blank"><img alt="Download PDF" border="0" src="../Include/images/pdf.png"/></a>', '<a class="tablebluelink" href="https://www.samplewebsite.com/xml-data/abcdef/higjkl/Thisisthe-required-document-link-4ea4-8f1c-dd36a1f55d6f.pdf" target="_blank"><img alt="Download PDF" border="0" src="../Include/images/pdf.png"/></a>']

soup = BeautifulSoup(''.join(links), 'lxml')
for link in soup.find_all('a', href=True):
    if link['href'].lower().endswith(".pdf"):
        print(link['href'])

简单明了,不是吗?

答案 1 :(得分:1)

正如Daniel Lee所指出的,正则表达式不适合解析HTML。但是,只要您的HTML在所有情况下都遵循特定的模式,就可以实现以下目的(显然,只是在沙盒环境中):

import re

pdf_links = map(lambda extracted_link: extracted_link.group(1),
                filter(lambda extracted_link: extracted_link \
                is not None, map(lambda link: \
                re.search(r'.*href=\"([^\"]+\.pdf)\".*', link,
                re.IGNORECASE), links)))

答案 2 :(得分:0)

首先,您永远不要使用正则表达式解析html。

“使用正则表达式解析html就像要求初学者编写操作系统一样”

这个答案是著名的,永远的回忆: RegEx match open tags except XHTML self-contained tags

花一个小时学习匹配组在正则表达式中的工作方式可能是值得的。但是,这可能会有所帮助:

首先,links是一个列表。这意味着您要么需要遍历它,要么(在这种情况下)您需要采用第一个元素。

尝试

 import re
 r = re.match(regex, lists[0])
 if r:
     print(r.group(1))