2017-04-07 10 views
0

Given this fileいくつかの `<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 "> 

、どのようにhrefタグの前www.example.comを追加し、すべての<a href="" title="">抽出するために、正規表現や美しいスープを使用して:

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']) 

しかし、タイトルと階層をどのように再配置するかはわかりません。 odradekの答えに基づいて UPDATE

、私はこれを試してみました:

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)] 

あなたのリストの2個の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」((開こうとしました:odradekの答えで提示または私のお気に入りの代替lxmlがあるとして、あなたは私の意見では、より読みやすいコードにつながる、BeautifulSoupを使用することができます、 'lxml') PREFIX = 'www.example.com' テンプレート= '{接頭辞} {URL} | html.find_all( 'a'、href = True)のeの場合は のようになります。 ] print(links) 'と空リストを得ました:' [] ' –

+1

これは私のコードと正確には異なります。 'html.parser'を使っている間に' lxml'パーサを使っています。また、 'bs4.BeautifulSoup'オブジェクトを' soup'変数にロードしている間に、リスト内包の 'html'を反復します。 – odradek

+0

申し訳ありません...私は上記のコードでゲインを試して、得ました: '---------------------------------- ----------------------------------------- KeyErrorトレースバック(直近の最後のコール) in () 9このリストの中にはあなたのforループが暗示されています 10 links = [template(prefix = PREFIX、url = e ['href']、title = e [ ( 'a'、href = True)] ' –

1

はこれが仕事ではありません正規表現のために。

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.fromstring(html)'の代わりに 'etree.parse( '../ file.htm')'を使用します。 –

+0

助けてくれてありがとう!...印刷する代わりに、どのようにそれらを単一のリストに追加することができますか? –

+1

ようこそ。答えの1つを解決策としてマークしてください。別の問題がある場合は、新しい質問をすることができます。しかし、最初はいくつかの基本的なチュートリアルを行うことを強くお勧めします。 (ヒント:https://www.tutorialsp.com/jp/python/python_lists.htm) –

関連する問題