我有一个链接列表存储为一个列表。但我只需要提取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"$)"""发布于 2018-06-20 06:41:25
每个人都会告诉你,使用regex处理HTML是错误的。我不想以任何方式向您展示如何这样做,我想向您展示使用库解析HTML是多么容易,例如经常推荐的BeautifulSoup 4。
为了保持简单和接近示例代码,我只需将输入列表简化。通常,您会直接将原始HTML提供给解析器(例如,请参阅这里)。
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'])简单直截了当,不是吗?
发布于 2018-06-20 06:20:12
正如Daniel所指出的,正则表达式不适合解析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)))发布于 2018-06-20 06:02:55
首先,您不应该用regex解析html。
用regex解析html就像要求初学者编写操作系统一样
这个答案是著名的,永远相关的:RegEx匹配打开的标记,但XHTML自包含标记除外。
花一个小时学习匹配组是如何在regex中工作的,这可能是值得的。但是,这可能有助于:
首先,links是一个列表。这意味着要么需要循环遍历它,要么(在本例中)需要使用第一个元素。
试一试
import re
r = re.match(regex, lists[0])
if r:
print(r.group(1))https://stackoverflow.com/questions/50941081
复制相似问题