2017-12-29 29 views
0

私はPythonを初めて使いました。プロジェクトの2回目の試みでは、部分文字列、特に識別番号をハイパーリファレンスURL。Pythonを使用して特定のハイパーリファレンスから特定の部分文字列を抽出する

たとえば、this urlは私の検索クエリの結果で、ハイパーリファレンスはhttp://www.chessgames.com/perl/chessgame?gid=1012809です。これから私は識別番号「1012809」を抽出し、URL でファイルをダウンロードする予定の後、URL http://www.chessgames.com/perl/chessgame?gid=1012809に移動するために追加したいと思います。しかし、私は識別子の抽出方法を理解することができないので、現在、私はこれの後ろにいくつかのステップを踏んでいます。ここで

は私のMWEです:

from bs4 import BeautifulSoup 
url = 'http://www.chessgames.com/perl/chess.pl?yearcomp=exactly&year=1932&playercomp=white&pid=&player=Alekhine&pid2=&player2=Naegeli&movescomp=exactly&moves=&opening=&eco=&result=1%2F2-1%2F2' 
page = urllib2.urlopen(url) 
soup = BeautifulSoup(page, 'html.parser') 
import re 
y = str(soup) 
x = re.findall("gid=[0-9]+",y) 
print x 
z = re.sub("gid=", "", x(1)) #At this point, things have completely broken down... 
+0

ここところでbeautifulsoupの使用は何ですか? – johnII

+2

're.findall()'はリストxを返します。あなたは関数 'x(1)'のようにリストを呼び出そうとしています。間違っていると 'x [0]'と書いて最初の値を得ることができます –

+0

ありがとう。私はあなたの答えをアップアップしましたが、私は15以上の評判をまだ確立していないので表示されません。 –

答えて

0

アルビンパウロはリストを返すre.findall、コメントとして、あなたはそれから要素を抽出する必要があります。ところで、BeautifulSoupは必要ありません。内容の文字列を取得するのにurllib2.urlopen(url).read()を使用してください。ここでもre.subは必要ありません。正規表現パターン(?:gid=)([0-9]+)で十分です。

import re 
import urllib2 
url = 'http://www.chessgames.com/perl/chess.pl?yearcomp=exactly&year=1932&playercomp=white&pid=&player=Alekhine&pid2=&player2=Naegeli&movescomp=exactly&moves=&opening=&eco=&result=1%2F2-1%2F2' 

page = urllib2.urlopen(url).read() 

result = re.findall(r"(?:gid=)([0-9]+)",page) 

print(result[0]) 
#'1012809' 
0

正規表現はまったく必要ありません。 Cssセレクターとストリング操作は、正しい方向にあなたを導きます。以下のスクリプトを試してみてください。

import requests 
from bs4 import BeautifulSoup 

page_link = 'http://www.chessgames.com/perl/chess.pl?yearcomp=exactly&year=1932&playercomp=white&pid=&player=Alekhine&pid2=&player2=Naegeli&movescomp=exactly&moves=&opening=&eco=&result=1%2F2-1%2F2' 
soup = BeautifulSoup(requests.get(page_link).text, 'lxml') 
item_num = soup.select_one("[href*='gid=']")['href'].split("gid=")[1] 
print(item_num) 

出力:

1012809 
関連する問題