使用`find_all()`获取同一标签子集的所有标签

时间:2016-03-11 02:14:50

标签: python beautifulsoup screen-scraping

我试图从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个标记集吗?

2 个答案:

答案 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'...]