簡體   English   中英

使用正則表達式從給定的鏈接列表中提取pdf鏈接

[英]Extracting pdf links from given list of Links using regular expressions

我有一個存儲為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"$)"""

每個人都會告訴您使用正則表達式處理HTML是錯誤的。 與其以任何方式向您展示如何做到這一點,我不希望向您展示使用一個庫(例如,經常推薦的BeautifulSoup 4)解析HTML實際上是多么容易。

為了使它更簡單並接近您的示例代碼,我只對輸入列表進行了展平。 通常,您會將原始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'])

簡單明了,不是嗎?

正如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)))

首先,您永遠不要使用正則表達式解析html。

“使用正則表達式解析html就像要求初學者編寫操作系統一樣”

這個答案是著名的,永遠的相關性: RegEx匹配開放標記,除了XHTML自包含標記

花一個小時學習匹配組在正則表達式中的工作方式可能是值得的。 但是,這可能會有所幫助:

首先, links是一個列表。 這意味着您需要遍歷它,或者(在這種情況下)您需要采用第一個元素。

嘗試

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM