javascript - 使用带有 BeautifulSoup 的 React JS 渲染的抓取元素

标签 javascript python selenium reactjs beautifulsoup

我想从这个特定页面的搜索结果中抓取带有 class="_1UoZlX"的 anchor 链接 - https://www.flipkart.com/search?as=on&as-pos=1_1_ic_sam&as-show=on&otracker=start&page=6&q=samsung+mobiles&sid=tyy%2F4io

当我从页面创建汤时,我意识到搜索结果是使用 React JS 呈现的,因此我无法在页面源(或汤)中找到它们。

这是我的代码

import requests
from bs4 import BeautifulSoup
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


listUrls = ['https://www.flipkart.com/search?as=on&as-pos=1_1_ic_sam&as-show=on&otracker=start&page=6&q=samsung+mobiles&sid=tyy%2F4iof']
PHANTOMJS_PATH = './phantomjs'
browser = webdriver.PhantomJS(PHANTOMJS_PATH)
urls=[]

for url in listUrls:
    browser.get(url)
    wait = WebDriverWait(browser, 20)
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "_1UoZlX")))
    soup = BeautifulSoup(browser.page_source,"html.parser")
    results = soup.findAll('a',{'class':"_1UoZlX"})
    for result in results:
        link = result["href"]
        print link
        urls.append(link)
    print urls

这是我遇到的错误。

Traceback (most recent call last):
  File "fetch_urls.py", line 19, in <module>
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "_1UoZlX")))
  File "/usr/local/lib/python2.7/site-packages/selenium/webdriver/support/wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 
Screenshot: available via screen

this answer 中提到的人有一种方法可以使用 selenium 来处理页面上的 javascript。有人可以详细说明吗?我进行了一些谷歌搜索,但找不到适用于这种特殊情况的方法。

最佳答案

你的代码没有问题,但你正在抓取的网站 - 它不会因为某种原因停止加载,从而阻止你编写的页面和后续代码的解析。

我尝试使用维基百科来确认:

from bs4 import BeautifulSoup
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

listUrls = ["https://en.wikipedia.org/wiki/List_of_state_and_union_territory_capitals_in_India"]
# browser = webdriver.PhantomJS('/usr/local/bin/phantomjs')
browser = webdriver.Chrome("./chromedriver")
urls=[]

for url in listUrls:
    browser.get(url)
    soup = BeautifulSoup(browser.page_source,"html.parser")
    results = soup.findAll('a',{'class':"mw-redirect"})
    for result in results:
        link = result["href"]
        urls.append(link)
    print urls

输出:

[u'/wiki/List_of_states_and_territories_of_India_by_area', u'/wiki/List_of_Indian_states_by_GDP_per_capita', u'/wiki/Constitutional_republic', u'/wiki/States_and_territories_of_India', u'/wiki/National_Capital_Territory_of_Delhi', u'/wiki/States_Reorganisation_Act', u'/wiki/High_Courts_of_India', u'/wiki/Delhi_NCT', u'/wiki/Bengaluru', u'/wiki/Madras', u'/wiki/Andhra_Pradesh_Capital_City', u'/wiki/States_and_territories_of_India', u'/wiki/Jammu_(city)']

附言我正在使用 chrome 驱动程序来针对真正的 chrome 浏览器运行脚本以进行调试。从 https://chromedriver.storage.googleapis.com/index.html?path=2.27/ 下载 chrome 驱动程序

关于javascript - 使用带有 BeautifulSoup 的 React JS 渲染的抓取元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41331423/

相关文章:

javascript - 无法检索在 servlet 中设置的值

javascript - 处理 jQuery.getScript 中的错误

java - Selenium 文件下载测试

javascript - Python:无法在网页中使用 Selenium 下载

java - 在 Windows 操作系统上启动 selenium 独立服务器和 geckodriver

javascript - promise 不返回任何数据以获取返回

python - 查找字符串中大写字符的索引号

python - 一维数组的 Richardson-Lucy 反卷积

python - 使用 Python 发送数千个 post 请求的最快方法是什么?

javascript - 无法在 AngularJs 中设置未定义的属性