【问题标题】:BeautifulSoup parser can't access html elementsBeautifulSoup 解析器无法访问 html 元素
【发布时间】:2017-08-04 06:20:49
【问题描述】:

我正在尝试抓取所有列表的 href。我对beautifulsoup 还很陌生,之前做过一些刮擦,但之前也做过一些刮擦。但我不能为我的生活提取。请参阅下面我的代码。当我运行这个脚本时,容器的长度为零。

我也尝试选择价格 (soup.findAll("span", {"class":"amount"}) ,但它没有反映。欢迎任何建议:)

import urllib.request
import urllib.parse
from bs4 import BeautifulSoup

url = 'https://www.takealot.com/computers/laptops-10130'   
headers = {}
headers['User-Agent'] = "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.27 Safari/537.17"
req = urllib.request.Request(url, headers=headers)
resp = urllib.request.urlopen(req)

respData = str(resp.read())

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

container = soup.find_all("div", {"class": "p-data left"})

【问题讨论】:

    标签: python python-3.x parsing web-scraping beautifulsoup


    【解决方案1】:

    页面使用 JavaScript 呈现。有几种方法可以渲染和抓取它。

    我可以用 Selenium 刮掉它。 首先安装 Selenium:

    sudo pip3 install selenium
    

    然后获取驱动程序https://sites.google.com/a/chromium.org/chromedriver/downloads,如果您使用的是 Windows 或 Mac,则可以使用无头版本的 chrome“Chrome Canary”。

    from bs4 import BeautifulSoup
    from selenium import webdriver
    
    browser = webdriver.Chrome()
    url = ('https://www.takealot.com/computers/laptops-10130')
    browser.get(url)
    respData = browser.page_source
    browser.quit()
    soup = BeautifulSoup(respData, 'html.parser')
    containers = soup.find_all("div", {"class": "p-data left"})
    for container in containers:
        print(container.text)
        print(container.find("span", {"class": "amount"}).text)
    

    或者使用PyQt5

    from PyQt5.QtGui import *
    from PyQt5.QtCore import *
    from PyQt5.QtWebKit import *
    from PyQt5.QtWebKitWidgets import QWebPage
    from PyQt5.QtWidgets import QApplication
    from bs4 import BeautifulSoup
    import sys
    
    
    class Render(QWebPage):
        def __init__(self, url):
            self.app = QApplication(sys.argv)
            QWebPage.__init__(self)
            self.loadFinished.connect(self._loadFinished)
            self.mainFrame().load(QUrl(url))
            self.app.exec_()
    
        def _loadFinished(self, result):
            self.frame = self.mainFrame()
            self.app.quit()
    
    url = 'https://www.takealot.com/computers/laptops-10130'
    r = Render(url)
    respData = r.frame.toHtml()
    soup = BeautifulSoup(respData, 'html.parser')
    containers = soup.find_all("div", {"class": "p-data left"})
    for container in containers:
        print (container.text)
        print (container.find("span", {"class":"amount"}).text)
    

    或者使用dryscrape:

    from bs4 import BeautifulSoup
    import dryscrape
    
    url = 'https://www.takealot.com/computers/laptops-10130'
    session = dryscrape.Session()
    session.visit(url)
    respData = session.body()
    soup = BeautifulSoup(respData, 'html.parser')
    containers = soup.find_all("div", {"class": "p-data left"})
    for container in containers:
        print(container.text)
        print(container.find("span", {"class": "amount"}).text)
    

    所有情况下的输出:

    Dell Inspiron 3162 Intel Celeron 11.6" Wifi Notebook (Various Colours)11.6 Inch Display; Wifi Only (Red; White & Blue Available)R 3,999R 4,999i20% OffeB 39,990Discovery Miles 39,990On Credit: R 372 / monthi
    3,999
    HP 250 G5 Celeron N3060 Notebook - Dark ash silverNBHPW4M70EAR 4,499R 4,999ieB 44,990Discovery Miles 44,990On Credit: R 419 / monthiIn StockShippingThis item is in stock in our CPT warehouse and can be shipped from there. You can also collect it yourself from our warehouse during the week or over weekends.CPT | ShippingThis item is in stock in our JHB warehouse and can be shipped from there. No collection facilities available, sorry!JHBWhen do I get it?
    4,499
    Asus Vivobook ...
    

    但是,在使用您的 URL 进行测试时,我观察到结果并非每次都可重现,有时在页面呈现后我的“容器”中没有内容。

    【讨论】:

    • 如果它对您有用,请随时接受答案和/或投票(您可以使用答案左侧的按钮。)
    猜你喜欢
    • 2021-04-23
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多