首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用正则表达式从给定的链接列表中提取pdf链接

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

Stack Overflow用户
提问于 2018-06-20 05:47:44
回答 3查看 1.1K关注 0票数 1

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

代码语言:javascript
复制
    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结尾的链接,如下所示

代码语言:javascript
复制
    https://www.samplewebsite.com/xml-data/abcdef/higjkl/Thisisthe-required-document-b4df-16t9g8p93808.pdf

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

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

代码语言:javascript
复制
    pdf_regex = r""" (^<a\sclass="tablebluelink"\shref="(.)+.pdf"$)"""
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-20 06:41:25

每个人都会告诉你,使用regex处理HTML是错误的。我不想以任何方式向您展示如何这样做,我想向您展示使用库解析HTML是多么容易,例如经常推荐的BeautifulSoup 4

为了保持简单和接近示例代码,我只需将输入列表简化。通常,您会直接将原始HTML提供给解析器(例如,请参阅这里)。

代码语言:javascript
复制
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'])

简单直截了当,不是吗?

票数 3
EN

Stack Overflow用户

发布于 2018-06-20 06:20:12

正如Daniel所指出的,正则表达式不适合解析HTML。但是,只要您的HTML在所有情况下都遵循特定的模式,这样的操作就会奏效(显然,只是在沙箱环境中):

代码语言:javascript
复制
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)))
票数 1
EN

Stack Overflow用户

发布于 2018-06-20 06:02:55

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

用regex解析html就像要求初学者编写操作系统一样

这个答案是著名的,永远相关的:RegEx匹配打开的标记,但XHTML自包含标记除外。

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

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

试一试

代码语言:javascript
复制
 import re
 r = re.match(regex, lists[0])
 if r:
     print(r.group(1))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50941081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档