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

2024-09-29 17:18:42 发布

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

我有一个链接列表存储为一个列表。但我只需要提取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结尾的链接,如下所示

^{pr2}$

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

有人能建议我用正则表达式来提取这个pdf链接吗? 我使用了下面的正则表达式,但它不起作用。在

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

Tags: httpscom列表datapdf链接wwwxml
3条回答

每个人都会告诉你用regex处理HTML是错误的。我不想向您展示如何用这种方法来完成,我想向您展示用库解析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'])

简单明了,不是吗?在

正如daniellee指出的,正则表达式不适合解析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)))

首先,你不应该用regex解析html。在

“用regex解析html就像让初学者编写操作系统”

这个答案是著名的并且永远相关的: RegEx match open tags except XHTML self-contained tags

花一个小时学习匹配组在regex中的工作方式可能是值得的。但是,这可能有助于:

首先,links是一个列表。这意味着您要么需要遍历它,要么(在本例中)需要获取第一个元素。在

试试看

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

相关问题 更多 >

    热门问题