【问题标题】:find href values filtering by class with beautiful soup用漂亮的汤找到按类过滤的href值
【发布时间】:2019-02-24 21:06:07
【问题描述】:

我的页面源具有“类”链接,如下例所示。我想返回一个包含所有“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'})

输出:

[]

【问题讨论】:

  • 您有网址,我们可以尝试不同的选择器吗?

标签: python python-3.x beautifulsoup


【解决方案1】:

您的第一个错误是将属性名称传递给find_all(),这会将第一个参数解释为标记名。接下来,您要求find_all() 过滤它找到的标签,只返回那些具有与给定值匹配的a class 属性的标签,标签中不能有带有空格的属性名称。

请注意,这里没有a class 标签,而是a 标签,带有classhref 属性。所以你想使用

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]")

这会查找至少 both web-btn-linkeasy-click 类的 a 标记,并且只查找具有 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’])

【讨论】:

  • @Martin Pieters 谢谢你,这成功了,感谢你的解释。我确实稍微修改了您的代码:soup = BeautifulSoup(driver.page_source) tags = soup.find_all('a', {'class': 'web-btn-link easy-click', 'href': True}) urls = [t['href'] for t in tags]
  • @modLmakur 这个答案似乎比另一个更规范。我建议接受此答案作为解决方案,以便该答案也将使未来的读者受益。
【解决方案2】:

您可以通过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)

【讨论】:

  • BeautifulSoup 元素没有href 属性。相反,您通过尝试访问该属性来触发隐式.find('href')
  • 接下来,BeautifulSoup 将类属性解析为一个列表;虽然您仍然可以匹配文字文本,但您现在不会将元素与 more 类匹配或以不同的顺序列出类。
  • 最后但同样重要的是,您的find_all() 可以返回没有具有 href 属性的元素,您可能需要考虑这一点。
  • @MartijnPieters 这个答案是我对 BeautifulSoup 的初步尝试之一,我相信你的评论将是无价的。
  • @DebanjanB 谢谢,我将您的 find_all 参数与之前的海报解决方案结合起来,得到了一个可行的解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 2020-01-20
  • 2019-09-06
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 2015-05-03
相关资源
最近更新 更多