如何修改我的代码以查找具有特定类的所有<a>标签的所有特定属性

时间:2019-08-06 20:57:12

标签: python beautifulsoup

我正在尝试使用 beautifulsoup 从以下列表中提取所有data-bk属性(以下的xyz<a>个带有class="bk3-link"的标签。 html的示例如下:

<a class="bk3-link" data-bk="x" ... >
<a class="bk3-link" data-bk="y" ... >
<a class="bk3-link" data-bk="z" ... >

我尝试提取所有data-bk属性,但它们在html中的其他位置使用。我尝试使用<a>搜索所有class = "bk3-link"标签,然后搜索其中的所有data-bk。我无法理解需要这样做的语法。

import requests
from bs4 import BeautifulSoup
headers = {"User-Agent": "Google Chrome v6.9"}
r = requests.get("https://www.randomwebsite", headers=headers)

soup = BeautifulSoup(r.text, "html.parser")

data1 = soup.find_all("a", {"data-bk" : True})
data2 = soup.find_all("a", class="bk3-link").find("a", data-bk)

如果我将数据1打印到控制台,我将拥有大量的html,包括其他data-bk属性。我真的只需要用data-bk返回<a>标记内的class="bk3-link"属性。尝试运行data2我得到:

  

SyntaxError:语法无效

2 个答案:

答案 0 :(得分:0)

您可以在find_all()中指定多个属性。

data1 = soup.find_all("a", attrs = {"class": "bk3-link", "data-bk": True})

答案 1 :(得分:0)

一个可能的解决方案是使用CSS选择器".bk3-link[data-bk]"-这将选择类bk3-link且包含属性data-bk的所有标签:

data = '''
<a class="bk3-link" data-bk="x">xxx</a>
<a data-bk="y">DONT SELECT</a>
<a class="bk3-link" data-bk="y">xxx</a>
<a class="bk3-link" data-bk="z">xxx</a>
<a data-bk="q">DONT SELECT</a>
'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(data, 'html.parser')

for tag in soup.select('.bk3-link[data-bk]'):
    print(tag['data-bk'])

打印:

x
y
z