2017-08-15 26 views
0

「スープ」に割り当てられたBeautifulSoupを使用してWebページをスクラップしました。 .textを 'site_url'の最後に追加するだけで、テキスト 'Aberdeen'を得ることができます。PythonでBeautifulSoupを使用してハイパーリンクからURLを取得

私が実際にやりたいことは、文字列内の完全なURLです。 「http://www.somewebsite.com/networks/site-info?site_id=ABD

>>>site_link = soup.find_all('a', string='Aberdeen')[0] 
>>>site_row = site_link.findParent('td').findParent('tr') 
>>>site_column = site_row.findAll('td') 
>>>site_url = site_column[0].contents[0] 
>>>print(site_url) 

<a href="../networks/site-info?site_id=ABD">Aberdeen</a> 

私はこれまで任意の運を持っていなかったとしようとする他に何かわかりません。どうすればURLを入手できますか?

+0

は[THIS](https://stackoverflow.com/a/1080472/7654934)を見てみましょう。お役に立てれば! –

+0

私が掻き取ろうとしているページはhttps://uk-air.defra.gov.uk/latest/currentlevelsで、私はテーブルの最初の列にあるサイト名に対応するURLに興味があります。 https://uk-air.defra.gov.uk/networks/site-info?site_id=ACTH最初の名前はAuchencorth Mossです – Paulos

+0

@ N.Ivanov私は同様のことを試しましたが、問題は多くの異なるページ上のリンクの種類、私はちょうど上記のリンクが欲しい – Paulos

答えて

2

正規表現を使用すると、正しいURLを取得するためにurljoinを使用するリンクを取得できます。

import requests 
import re 

try: 
    from urlparse import urljoin # Python2 
except ImportError: 
    from urllib.parse import urljoin # Python3 

from bs4 import BeautifulSoup 
url= 'https://uk-air.defra.gov.uk/latest/currentlevels' 
r = requests.get(url, headers={'User-Agent': 'Not blank'}) 
data = r.text 
soup = BeautifulSoup(data, 'html.parser') 
for elem in soup('a', href=re.compile(r'site_id')): 
    print (elem.text) 
    print (urljoin(url,elem['href'])) 

出力:

Auchencorth Moss 
https://uk-air.defra.gov.uk/networks/site-info?site_id=ACTH 
Bush Estate 
https://uk-air.defra.gov.uk/networks/site-info?site_id=BUSH 
Dumbarton Roadside 
https://uk-air.defra.gov.uk/networks/site-info?site_id=DUMB 
Edinburgh St Leonards 
https://uk-air.defra.gov.uk/networks/site-info?site_id=ED3 
Glasgow Great Western Road 
https://uk-air.defra.gov.uk/networks/site-info?site_id=GGWR 
Glasgow High Street 
https://uk-air.defra.gov.uk/networks/site-info?site_id=GHSR 
... 

あなただけのアバディーンの使用が必要な場合:

for elem in soup('a',href=re.compile(r'site_id'), string='Aberdeen'): 

の代わり:

for elem in soup('a', href=re.compile(r'site_id')): 

出力:

Aberdeen 
https://uk-air.defra.gov.uk/networks/site-info?site_id=ABD 
0

これを試してください。私はそれがすべての要件を満たしていることを願っています:

import requests ; from lxml import html 

base_link = "https://uk-air.defra.gov.uk" 
response = requests.get("https://uk-air.defra.gov.uk/latest/currentlevels", headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36'}).text 
tree = html.fromstring(response) 
for title in tree.cssselect("table.current_levels_table td a:not(.smalltext)"): 
    print(base_link + title.attrib['href'][2:]) 

部分的な結果:

https://uk-air.defra.gov.uk/networks/site-info?site_id=ACTH 
https://uk-air.defra.gov.uk/networks/site-info?site_id=BUSH 
https://uk-air.defra.gov.uk/networks/site-info?site_id=DUMB 
https://uk-air.defra.gov.uk/networks/site-info?site_id=ED3 
https://uk-air.defra.gov.uk/networks/site-info?site_id=GGWR 
https://uk-air.defra.gov.uk/networks/site-info?site_id=GHSR 
https://uk-air.defra.gov.uk/networks/site-info?site_id=GLA4 
関連する問題