【问题标题】:Can't scrape nested tags using BeautifulSoup无法使用 BeautifulSoup 抓取嵌套标签
【发布时间】:2019-08-12 21:23:51
【问题描述】:

我正在尝试进行网络抓取,目前我正纠结于如何从嵌套在 2 个 div 中的“a”标签中获取 href 链接,而该标签又位于“li”标签内。

例如,为了便于描述问题,请考虑以下代码:

<li class="top">
  <div class="b">
    <div class="c">
       <div class= "d">...</div>
       <div class= "e"> <a href="link.com" class= "f">..</a>
       </div>
     </div>
  </div>
</li>
<li class="top">Same kind of classes as before with different link </li>
<li class="top">Same kind of classes as before with different link</li>

我想在这里获取link.com。此外,每个列表项都存在相同的类名。那么我该如何抓取这个link.com 请注意,有关真实代码,请参阅以下链接: Please click here for the Image of the code

我尝试了各种我通过其他类似问题搜索的东西,但没有一个对我有用。

jobs=soup.find_all('li', {"class": "top"})

for job in jobs:
  #  linkk=job.select("div.b > div.c > div.e > a[href]")
   # linkk
   # link1= job.findAll('div', attrs={"class": "b"})
   # link2= link1.findAll('div', attrs = {"class": "c"})
   # link3= link2.findAll('div', attrs={"class": "e"})
    link4= job.findAll('a', attrs={"class":"f"}).get('href')
    print(link4) 

请注意,此代码包含我尝试过的各种技术,因此不应将其全部用作参考。我只想知道如何获取这个'a'标签的href部分。

提前致谢! 附:犹豫是因为我在 Stack Overflow 上的第一个问题

【问题讨论】:

  • 您能分享一下您要删除的网页吗?
  • 实际上是它的LinkedIn。我正在尝试查找所有内容作者的链接。网址:linkedin.com/search/results/people/…
  • 欢迎来到 *。为了获得最好的帮助,请考虑阅读How to Ask
  • @MichaelD 请查看我试图简化问题以获得更好的可读性。
  • 注意,在这种特殊情况下,for 循环中不会有任何内容,因为找不到 li 元素

标签: python web-scraping beautifulsoup


【解决方案1】:

在这里,您要访问的元素是在 js 执行后创建的(仅适用于登录用户),因此如果您检查现有代码,如果您检查 soup.body,您将无法看到该 li 标签。

因此,如果页面在您的情况下使用 JS 动态加载数据,那么您必须使用 selenium。

我为您创建了一个示例。希望这会有所帮助!

import time
from bs4 import BeautifulSoup
from selenium import webdriver

url = "https://www.linkedin.com/search/results/people/?keywords=freelance%20content%20writer&origin=RELATED_SEARCH_FROM_SRP&page=1"

driver = webdriver.Chrome('Path to ChromeDriver') 

driver.get(url)
time.sleep(150) #experiment with timer to fetch all the data
page = driver.page_source
driver.quit()
soup = BeautifulSoup(page, 'html.parser')
#print(soup)
container = soup.find_all('li', attrs={
    'class':'search-result search-result__occluded-item ember-view'})

for c in container:
    for link in c.findAll('a', attrs={'class':'search-result__result-link ember-view'}):
        print(link.get('href')) 

在此处下载 ChromDriver 表单[https://chromedriver.chromium.org/downloads]
附言检查您的 chrome 版本以下载驱动程序。

【讨论】:

  • 真的!发现网站是动态加载的,这导致了问题。谢谢!
  • @VIPULVAIBHAV 当然!我希望现在你能够得到预期的结果。 :)
【解决方案2】:

问题是您在第二个find_all 中获得了多个值。所以你也需要循环这些来执行get("href")

soup = BeautifulSoup('<li class="top"><div class="b"><div class="c"><div class= "d">...</div><div class= "e"> <a href="link.com" class= "f">..</a></div></div></div></li>')

job = soup.find_all('li', {'class':'top'})

for j in job:
    for i in j.find_all('a', {'class':'f'}):
        print(i.get('href'))

输出

link.com

【讨论】: