Beautiful Soup / urllib不会读取某些HTML标记

问题描述 投票:1回答:1

我最近开始使用Beautiful Soup。为了练习,我试图刮掉this website

有一些div标签,刮刀似乎无法访问,即使URL阅读器似乎没有读取这些div标签。 HTML并未表明它正在使用JavaScript来处理未被读取的部分,因此理论上我认为不需要Selenium。特别是在名为“ajaxTarget”的ID下的div标签是关注点。下面的代码返回一些元素,但不读取此特定标记下的大多数div标记。

from urllib.request import Request, urlopen
from bs4 import BeautifulSoup

def main():
    url_link = 'https://www.countryflags.com/en/'
    req = Request(url_link, headers={'User-Agent': 'Mozilla/5.0'})
    page = urlopen(req).read()
    soup = BeautifulSoup(page, features='lxml')
    div_master_container = soup.findAll('div', attrs={'id': 'ajaxTarget'})
    print(len(div_master_container))
    for item in div_master_container:
        print(item)

if __name__ == '__main__':
    main()

如果有人能够指出HTML中是否存在我缺少的元素或者导致此问题的任何其他因素,我将不胜感激。

python-3.x web-scraping beautifulsoup urllib
1个回答
0
投票

Javascript需要在页面上运行。使用像硒这样的方法

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
url ='https://www.countryflags.com/en/'
driver = webdriver.Chrome()
driver.get(url)
items = [[item.get_attribute('href'),item.get_attribute('title')] for item in WebDriverWait(driver,30).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#ajaxTarget [title]")))]
print(items)
print(len(items))
#driver.quit()
© www.soinside.com 2019 - 2024. All rights reserved.