我的页面源具有“类”链接,如下例所示。我想返回一个包含所有“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'})
输出:
[]
您可以通过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)
您的第一个错误是将属性名称传递给find_all()
,后者将第一个参数解释为标记名。接下来,您要求find_all()
过滤它找到的标记,只返回那些具有与给定值匹配的a class
属性的标记,标记不能包含带有空格的属性名称。
请注意,这里没有a class
标签,你有a
标签,带有class
和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]")
这会查找至少包含a
和web-btn-link
类的easy-click
标签,以及仅具有href
属性的标签。
调用仍将生成一系列标记对象,只获取属性,使用订阅:
soup = BeautifulSoup(driver.page_source)
tags = soup.select("a.web-btn-link[href]")
urls = [t['href'] for t in tags]
或者,只需逐个打印:
for tag in tags:
print(t[‘href’])