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

2024-09-28 21:28:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python的新手,在我第二次尝试一个项目时,我想从url上的超引用中提取一个子字符串,特别是一个标识号。你知道吗

例如,this url是我的搜索查询的结果,给出了超引用http://www.chessgames.com/perl/chessgame?gid=1012809。从这里我想提取识别号“1012809”,并将其附加到urlhttp://www.chessgames.com/perl/chessgame?gid=1012809,然后我计划在urlhttp://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...

Tags: importrecomhttpurlwwwthisperl
2条回答

你根本不需要正则表达式。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

正如Albin Paul评论的那样,re.findall返回一个列表,您需要从中提取元素。顺便说一下,这里不需要BeautifulSoup,使用urllib2.urlopen(url).read()来获取内容的字符串,这里也不需要re.sub,一个regex模式(?: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'

相关问题 更多 >