查找按类别过滤的href值和漂亮的汤

时间:2019-02-24 21:06:08

标签: python python-3.x beautifulsoup

我有一个页面源,其中包含“类”链接,如下例所示。我想返回一个包含所有“ href”值的列表,因此在下面的示例“ / detail / Request-Technology%2C-LLC-Oakland-CA-94609 / napil006 / cyberMan”中。 find_all尝试使用“ a class”属性,但未返回任何内容。有人可以看到我在做什么错并提出解决方案吗?

来源:

<a class="web-btn-link easy-click" href="/detail/Request-Technology%2C-LLC-Oakland-CA-94609/napil006/cyberMan" id="position15" onclick="cookieJobID('b54b4b964def18552eefff31d034d2a5');handleBackButton(this);" style="font-size:18px;" title=“stuff” value="b54b4b964def18552eefff31d034d2a5">

代码:

BeautifulSoup(driver.page_source).find_all('href', {'a class':'web-btn-link easy-click'})

输出:

[]

2 个答案:

答案 0 :(得分:3)

您的第一个错误是将属性名称传递给find_all(),后者将第一个参数解释为 tagname 。接下来,您要求find_all()过滤找到的标签,以仅返回具有与给定值匹配的a class属性的标签,标签中不能包含空格的属性名称。

请注意,这里没有a class标签,而具有aclass属性的href标签。所以您想使用

soup = BeautifulSoup(driver.page_source)
tags = soup.find_all('a', {'class': 'web-btn-link', 'href': True})

'href': True过滤器仅在标记定义了该属性的情况下才匹配。请注意,我仅过滤两个类中的一个。请参阅Searching By CSS Class,这很重要,但是您通常不希望排除匹配的标签,而不仅仅是找到的两个类。在绝大多数文档中,您通常只需要匹配一个类(easy-click听起来像是脚本或CSS增强的类,应用于页面上可能不同的元素)。

使用CSS .select() call,这种搜索要容易得多:

soup = BeautifulSoup(driver.page_source)
tags = soup.select("a.web-btn-link.easy-click[href]")

这将查找至少具有{em> {em} {em} {em}和a类的web-btn-link标签,并且仅查找具有easy-click属性的标签。 / p>

该调用仍将产生一系列标记对象,仅使用订阅即可获取属性:

href

或者,仅一张一张地打印它们:

soup = BeautifulSoup(driver.page_source)
tags = soup.select("a.web-btn-link[href]")
urls = [t['href'] for t in tags]

答案 1 :(得分:-1)

您可以通过 BeautifulSoup 收集所有所需的元素并存储在列表中,然后遍历列表以打印href属性,如下所示:

href_elements = BeautifulSoup(driver.page_source).find_all('a', {'class':'web-btn-link easy-click'})
for href_element in href_elements:
    print(href_element.href)