我试图从html文档中找到特定类型的所有<a>
HTML标记。
我的代码:
for i in top_url_list:
r = requests.get(top_url_list[i])
soup = BeautifulSoup(r.content)
此时我需要在href
标记中提取(使用一些正则表达式)部分链接。
标签如下所示:
"<a href="/players/a/abdelal01.html">Alaa Abdelnaby</a>"
还有其他<a href...>
代码不遵循此惯例,我不想find_all()
。
我可以通过find_all()
来检索我需要处理的正确href
个标记集吗?
答案 0 :(得分:1)
页面上还有其他链接不遵循该约定,因为它们不是指向播放器页面的链接,它们可能是指向团队页面的链接等等。
然后我会检查href
是否以 /players
开头:
for link in soup.select('a[href^="/players"]'):
print(link["href"])
或者,包含 players
:
for link in soup.select('a[href*=players]'):
print(link["href"])
由于您只对html
文件名感兴趣,请按/
拆分并获取最后一项:
print(link["href"].split("/")[-1])
答案 1 :(得分:0)
因为你想要的只是href
标签本身的一部分,所以不需要使用Beautiful Soup或HTML解析器。此任务可以单独使用页面源和正则表达式完成,如下所示。
正则表达式匹配像abdelal01.html
这样的字符串,它包含字符,两个数字,一个句点和另一组字符。表达式本身作为findall
函数的第一个参数传入,第二个参数是页面源。这是通过使用urlopen()
方法完成的,调用read()
函数来获取HTML,然后将其转换为字符串格式以供正则表达式使用。
结果显示如下 - 它输出href
标记列表,您可以迭代并附加到原始网址。我希望这有帮助!
from urllib.request import urlopen
import re
url = "http://www.basketball-reference.com/players/a/"
result = re.findall("\/([a-z]+[0-9][0-9]\W[a-z]+)", str(urlopen(url).read()))
print(result)
输出:
['abdelal01.html', 'abdulza01.html', 'abdulka01.html', 'abdulma02.html', 'abdulta01.html', 'abdursh01.html', 'abernto01.html', 'able
fo01.html', 'abramjo01.html', 'ackeral01.html', 'ackerdo01.html', 'acresma01.html', 'actonbu01.html', 'acyqu01.html', 'adamsal01.htm
l', 'adamsdo01.html', 'adamsge01.html', 'adamsha01.html', 'adamsjo01.html'...]