我有一个存储为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"$)"""
答案 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))