首页 > 解决方案 > 如何使用 soup.find_all() 提供以 sometext 开头的 attrs

问题描述

我试图抓取这个网站,[在此处输入链接描述][1]

[1]: https://beta.sam.gov/search?keywords=&sort=-modifiedDate&index=opp&is_active=true&page=1我要抓取的所有数据都将插入到一个 div 中,该 div 的类每次都获得动态值。wo 我想使用 soup.find_all() 找到所有这些 div 并为其类提供起始字符串。

这是我当前的代码,

outerDivs = soup.find_all(attrs={"tabindex": "-1", "class": "ng-tns-c1-1 ng-star-inserted"})

我想要得到的是 find_all() 具有属性 tabindex=1 的 div 并且类以ng-tns-... ng-star-inserted. 唯一改变的值是ng-tns……现在看起来ng-tns-c294-1 ng-star-inserted请注意ng-star-inserted总是保持不变。

这就是我获得汤代码的方式。

       driver.get(
            f'https://beta.sam.gov/search?keywords=&sort=-modifiedDate&index=opp&is_active=true&page={currentpage}')
        WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div#search-results")))
        source = driver.page_source
        soup = BeautifulSoup(source, 'lxml')

当前页每次加一进入下一页

标签: pythonweb-scrapingbeautifulsoup

解决方案


我不是最好的正则表达式,所以可能有更好的方法来做到这一点,但这应该可以解决问题:

soup.find_all(attrs={"tabindex": "-1", "class": re.compile("^ng-tns.*ng-star-inserted$")})

它只会匹配一个以“ng-tns”开头的类,具有任意数量的字符,然后专门以“ng-star-inserted”结尾。


推荐阅读