使用Python从特定的超引用中提取特定子字符串

时间:2017-12-29 12:17:20

标签: python regex beautifulsoup

我是Python的新手,为了第二次尝试项目,我想从网址上的超引用中提取子字符串 - 特别是识别号码。

例如,this url是我的搜索查询的结果,提供了超引用http://www.chessgames.com/perl/chessgame?gid=1012809。从此我想提取识别号码“1012809”并将其附加到导航到网址http://www.chessgames.com/perl/chessgame?gid=1012809,之后我计划在网址http://www.chessgames.com/pgn/alekhine_naegeli_1932.pgn?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...

2 个答案:

答案 0 :(得分:0)

正如Albin Paul评论的那样,re.findall返回一个列表,你需要从中提取元素。顺便说一下,你不需要BeautifulSoup,使用urllib2.urlopen(url).read()来获取内容的字符串,此处也不需要re.sub,一个正则表达式模式{{ 1}}就足够了。

(?:gid=)([0-9]+)

答案 1 :(得分: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