2017-04-07 38 views
0

Given this file如何提取所有的HREFs和標題從幾個`<a href="" title=""> tags?

<a data-parent="#accordion1" data-toggle="collapse" href="# fruitName1" title="Click to expand drug name"> 
<span class="list-unstyled" style="text-decoration: none;"></span> GLIPIZIDE 
     </a> 
<a href="/loads/data/usersindex.cfm?event=overview.subprocess&amp;ApplNo=114223" title="Click to view LEMONS (LEMONS) | POQ #114223 | BOX;67 PZ | PRESENTATION | FRUIT COMPANY 1 "> 
           LEMONS (LEMONS)</a> 
<a href="/loads/data/usersindex.cfm?event=overview.subprocess&amp;ApplNo=114226" title="Click to view LEMONS (LEMONS) | POQ #114226 | BOX;67 PZ | PRESENTATION | FRUIT COMPANY 2 "> 
           LEMONS (LEMONS)</a> 
<a href="/loads/data/usersindex.cfm?event=overview.subprocess&amp;ApplNo=114305" title="Click to view LEMONS (LEMONS) | POQ #114305 | BOX;67 PZ | PRESENTATION | FRUIT COMPANY 3 "> 
           LEMONS (LEMONS)</a> 
<a href="/loads/data/usersindex.cfm?event=overview.subprocess&amp;ApplNo=114370" title="Click to view LEMONS (LEMONS) | POQ #114370 | BOX;67 PZ | Discontinued | FRUIT COMPANY 1 "> 
           LEMONS (LEMONS)</a> 
<a href="/loads/data/usersindex.cfm?event=overview.subprocess&amp;ApplNo=114378" title="Click to view LEMONS (LEMONS) | POQ #114378 | BOX;67 PZ | Discontinued | FRUIT COMPANY 4 "> 
           LEMONS (LEMONS)</a> 
<a href="/loads/data/usersindex.cfm?event=overview.subprocess&amp;ApplNo=114387" title="Click to view LEMONS (LEMONS) | POQ #114387 | BOX;67 PZ | Discontinued | FRUIT COMPANY 5 "> 
           LEMONS (LEMONS)</a> 
<a href="/loads/data/usersindex.cfm?event=overview.subprocess&amp;ApplNo=114438" title="Click to view LEMONS (LEMONS) | POQ #114438 | BOX;67 PZ | PRESENTATION | FRUIT COMPANY 2 "> 
           LEMONS (LEMONS)</a> 
<a href="/loads/data/usersindex.cfm?event=overview.subprocess&amp;ApplNo=114497" title="Click to view LEMONS (LEMONS) | POQ #114497 | BOX;67 PZ | PRESENTATION | FRUIT COMPANY 5 "> 
           LEMONS (LEMONS)</a> 
<a href="/loads/data/usersindex.cfm?event=overview.subprocess&amp;ApplNo=114542" title="Click to view LEMONS (LEMONS) | POQ #114542 | BOX;67 PZ | Discontinued | FRUIT COMPANY 3 "> 
           LEMONS (LEMONS)</a> 
<a href="/loads/data/usersindex.cfm?event=overview.subprocess&amp;ApplNo=114550" title="Click to view LEMONS (LEMONS) | POQ #114550 | 
     </a> 
<a href="/loads/data/usersindex.cfm?event=overview.subprocess&amp;ApplNo=117270" title="Click to view GRAPES (GREEN GRAPES ; AUS) | POQ #117270 | BOX;67 PZ | PRESENTATION | FRUIT COMPANY 10 "> 
           GRAPES (GREEN GRAPES ; AUS)</a> 
<a href="/loads/data/usersindex.cfm?event=overview.subprocess&amp;ApplNo=117511" title="Click to view GRAPES (GREEN GRAPES ; AUS) | POQ #117511 | BOX;67 PZ | PRESENTATION | FRUIT COMPANY 11 "> 
           GRAPES (GREEN GRAPES ; AUS)</a> 
<a href="/loads/data/usersindex.cfm?event=overview.subprocess&amp;ApplNo=117620" title="Click to view GRAPES (GREEN GRAPES ; AUS) | POQ #117620 | BOX;67 PZ | PRESENTATION | FRUIT COMPANY 12 "> 

使用正則表達式或美麗的湯,怎麼提取所有<a href="" title="">,在href標籤之前添加www.example.com到:

www.example.com/loads/data/usersindex.cfm?event=overview.subprocess&amp;ApplNo=114223 | title= | Click to view LEMONS (LEMONS) | POQ #114223 | BOX;67 PZ | PRESENTATION | FRUIT COMPANY 1 | LEMONS (LEMONS) 
www.example.com/loads/data/usersindex.cfm?event=overview.subprocess&amp;ApplNo=114226 | title= | Click to view LEMONS (LEMONS) | POQ #114226 | BOX;67 PZ | PRESENTATION | FRUIT COMPANY 2 | LEMONS (LEMONS) 
www.example.com/loads/data/usersindex.cfm?event=overview.subprocess&amp;ApplNo=114305 | title= | Click to view LEMONS (LEMONS) | POQ #114305 | BOX;67 PZ | PRESENTATION | FRUIT COMPANY 3 | LEMONS (LEMONS) 
www.example.com/loads/data/usersindex.cfm?event=overview.subprocess&amp;ApplNo=114370 | title= | Click to view LEMONS (LEMONS) | POQ #114370 | BOX;67 PZ | Discontinued | FRUIT COMPANY 1 | LEMONS (LEMONS) 

我想:

for a in soup.tbody.findAll('a', href=True): 
    r = re.compile('(?<=href=").*?(?=")') 
    r.findall(str(a) 

和:

for a in soup.tbody.findAll('a', href=True): 
    print (a.find('a')['href']) 
    print (a.find('a')['title']) 

但是,我不知道如何重新排列標題和hrefs。 UPDATE

基於odradek的答案,我想這一點:

soup = BeautifulSoup(open('file.htm'), 'lxml') 
for a in soup.tbody.findAll('a', href=True): 
    html = a 
    PREFIX = 'www.example.com' 
    template = '{prefix}{url} | {title}'.format 
    links = [template(prefix=PREFIX, url=e['href'], title=e['title']) for e in html.find_all('a', href=True)] 
    print(links) 

不過我:

[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 

回答

2

可以使用BeautifulSoup解析方法,而不是複雜的正則表達式此:

# this is the url you want to add at the beginning 
PREFIX = 'www.example.com' 

# the template of your desired output 
template = '{prefix}{url} | {title}'.format 

# the resulting list, please note that "html" variable is 
# the given source code. 
links = [template(prefix=PREFIX, url=e.get('href'), title=e.get('title')) 
     for e in html.find_all('a', href=True)] 

當對你的列表兩種a標籤跑:

$ python get_all_a.py 
www.example.com/loads/data/usersindex.cfm?event=overview.subprocess&ApplNo=117511 | Click to view GRAPES (GREEN GRAPES ; AUS) | POQ #117511 | BOX;67 PZ | PRESENTATION | FRUIT COMPANY 11 
www.example.com/loads/data/usersindex.cfm?event=overview.subprocess&ApplNo=117620 | Click to view GRAPES (GREEN GRAPES ; AUS) | POQ #117620 | BOX;67 PZ | PRESENTATION | FRUIT COMPANY 12 

根據您的更新,你不應該把這段代碼內部的for循環,而不是:

html = BeautifulSoup(open('file.htm'), 'html.parser') 

PREFIX = 'www.example.com' 

template = '{prefix}{url} | {title}'.format 

# inside this list comprehension is your for loop implied 
links = [template(prefix=PREFIX, url=e.get('href'), title=e.get('title')) 
     for e in html.find_all('a', href=True)] 
+0

我想'湯= BeautifulSoup(開(「/ file.htm」) ,'lxml') PREFIX ='www.example.com' template ='{prefix} {url} | {title}'。格式 links = [template(prefix = PREFIX,url = e ['href'],title = e ['title']) for html.find_all('a',href = True) ] 打印(鏈接)'並得到一個空的列表:'[]' –

+1

這不完全是我的代碼。當我使用'html.parser'時,你正在使用'lxml'分析器。另外,您正在將'bs4.BeautifulSoup'對象加載到'soup'變量中,同時在列表理解中遍歷'html'。 – odradek

+0

對不起...我試着用上面的代碼獲得並得到:'---------------------------------- ----------------------------------------- KeyError Traceback(最近一次調用的最後一個) in () 9#此列表內理解是你的for循環暗示 10 links = [template(prefix = PREFIX,url = e ['href'],title = e [ ''title]]) ---> 11 for e在html.find_all('a',href = True)]' –

1

這不是任務爲正則表達式。您可以使用BeautifulSoup作爲odradek的答案呈現或有我最喜歡的替代lxml,這在我看來導致更可讀的代碼:

from lxml import etree 

tree = etree.fromstring(html) 
for element in tree.xpath('//a'): 
    print('www.example.com' + element.get('href')) 
    print('title: ' + element.get('title')) 
+1

從文件使用'etree.parse('../ file.htm')'而不是'etree.fromstring(html)'解析。 –

+0

感謝您的幫助!...而不是打印它們如何將它們追加到單個列表中? –

+1

不客氣。請將其中一個答案標記爲解決方案。如果你還有其他問題,你可以問一個新問題。不過,我強烈建議首先閱讀一些基本教程。 (提示:https://www.tutorialspoint.com/python/python_lists.htm) –