【问题标题】:Scraping Data with Beautiful Soup用 Beautiful Soup 抓取数据
【发布时间】:2023-03-31 15:25:02
【问题描述】:

我正在尝试将我的 Vudu 电影列表中的电影名称抓取到 csv 文件中。我处于早期阶段,我不知道如何使用 BeautifulSoup 来获得名称。我知道它在网站上的 html 中的位置。我现在将它设置为打印位置,但它全部返回“无”。

到目前为止,我已经包含了我的代码进度以及我需要的网站上的 html 代码照片。感谢任何提供帮助的人!

##Make sure to replace USERNAME and PASSWORD with your own username and password

#Import libraries
from bs4 import BeautifulSoup
from lxml import html
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import csv
import json
import re
import requests
import time
import urllib.request

#Login Information
USERNAME = "example"
PASSWORD = "example"

#URLs
login_url = "https://my.vudu.com/MyLogin.html?type=sign_in&url=https%3A%2F%2Fwww.vudu.com%2F"
url = "https://www.vudu.com/movies/#my_vudu/my_movies"

def main():
    session_requests = requests.session()

    chromedriver = 'C:\\chromedriver.exe'
    browser = webdriver.Chrome(chromedriver)
    browser.get('https://my.vudu.com/MyLogin.html?type=sign_in&url=https%3A%2F%2Fwww.vudu.com%2F')

    time.sleep(10)

    username = browser.find_element_by_name('email')
    password = browser.find_element_by_name('password')

    username.send_keys(USERNAME)
    password.send_keys(PASSWORD)

    browser.find_element_by_css_selector('.custom-button').click()

    html = urllib.request.urlopen(url)

    soup = BeautifulSoup(html, 'html.parser')

    name_box = soup.find('div', attrs={'class': 'gwt-Label title'})

    print (name_box)

if __name__ == '__main__':
    main()

【问题讨论】:

  • 你确定内容不是用javascript动态加载的吗?
  • images2.vudu.com/poster2/132100-m" alt="10,000 B.C.">
  • 第一个标题是 10,000 B.C.
  • 所以我觉得有办法使用这种方法来做到这一点

标签: python python-3.x beautifulsoup python-requests urllib


【解决方案1】:

urllib.request.urlopen(url)(和requests.get(url))直接从服务器获取HTML,这意味着它没有通过JavaScript在Web浏览器中添加元素。而且还没有登录。

但是你的用户 Selenium 加载页面并运行 JavaScript,你可以从 browser.page_source 获取包含所有更改的 HTML 并在

中使用
soup = BeautifulSoup(browser.page_source, 'html.parser')

问题是如果Selenium 有函数find_* 在页面上搜索,为什么要使用BeautifulSoup


编辑: 使用SeleniumBeautifulSoup 中的方法的示例

from selenium import webdriver
from bs4 import BeautifulSoup
import time

#chromedriver = 'C:\\chromedriver.exe'
#browser = webdriver.Chrome(chromedriver)
browser = webdriver.Firefox()

browser.get("https://www.vudu.com/")
time.sleep(1)

print('--- Selenium ---')

all_images = browser.find_elements_by_css_selector('.border .gwt-Image')
for image in all_images[:5]: # first five elements
    #print('image:', image.get_attribute('src'))
    print('alt:', image.get_attribute('alt'))

print('--- BeautifulSoup ---')

soup = BeautifulSoup(browser.page_source, 'html.parser')

all_images = soup.select('.border .gwt-Image')
for image in all_images[:5]: # first five elements
    #print('image:', image['src'])
    print('alt:', image['alt'])

结果:

--- Selenium ---
alt: It (2017)
alt: American Made
alt: Dunkirk
alt: mother!
alt: The LEGO NINJAGO Movie
--- BeautifulSoup ---
alt: It (2017)
alt: American Made
alt: Dunkirk
alt: mother!
alt: The LEGO NINJAGO Movie

【讨论】:

  • 如果我要使用 selenium,我将如何处理我想要的特定数据?
  • Selenium 有许多函数find_element_by_*(用于第一个元素)和find_elements_by_*(用于许多元素),例如find_elements_by_class_name('gwt-Label')find_elements_by_css_selector('div.gwt-Label.title')find_elements_by_xpath('//div[@class="gwt-Label title"]')。阅读文档:4.Locating Elements
  • 见答案示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-11
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多