【问题标题】:How to parse a dynamic dom element?如何解析动态dom元素?
【发布时间】:2019-05-13 15:39:29
【问题描述】:

我想做一个解析器来抓取价格,但是我找不到解析innerHTML的工作方法

我不知道为什么,但是 selenium (getAttribute(innerHTML))、phantomjs (page.evaluation function(){return document.ElementToParse.innerHTML}) 和 scrapy-splash (使用 WebPageEngine 加载网页并解析 html)不工作。一直以来,结果都是空的“[]”、null 或 webelement

我在 banggood 的产品和登录页面上测试了我的代码,但结果总是一样的。

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

driver = webdriver.Firefox()
driver.get("https://www.banggood.com/BlitzWolf-Ampcore-Turbo-TC10-3A-Durable-USB-Type-C-Charging-Data-Cable-p-1188424.html?rmmds=category&cur_warehouse=CN") #random url
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "item_now_price"))
    )
finally:
    driver.quit()
print(element)

和输出:

<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="b0593791-138b-4177-a8f3-e7983143824a", element="d08f4717-d3f1-4594-8f2b-1bf943deb9f9")>

当需要类似的东西时:

6.59(or US$6.59)

我也试过了

price = driver.find_element_by_class_name('item_now_price').getAttribute("innerHTML")

var page = require('webpage').create();

page.open('https://www.banggood.com/BlitzWolf-Ampcore-Turbo-TC10-3A-        Durable-USB-Type-C-Charging-Data-Cable-p-1188424.html?rmmds=category&cur_warehouse=CN', function(status) {

    var price = page.evaluate(function() {
        return document.getElementByClassName('item_now_price').innerHTML;
        });
console.log('price is ' + price);
phantom.exit();
});

但结果为空,当我添加时

page.includeJs(/url/to/js)

终端停止工作

s

【问题讨论】:

  • 欢迎来到堆栈!如果您可以提供一些关于您的问题的更具体的信息而不是笼统的信息,那将会很有帮助。例如,为特定元素提供您尝试过的 html,以及您尝试过的代码示例、您期望的结果以及您得到的结果。
  • 对不起,我忘了插入代码

标签: python parsing phantomjs innerhtml


【解决方案1】:

在 selenium 中获取元素后,您可以使用 .text 获取该元素的文本

请参阅下面对第一个示例的细微调整:

try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "item_now_price"))
    )
    print(element.text)
finally:

看看这是否能得到你想要的结果。

【讨论】:

  • 我可以问你一些问题吗?
  • 你知道更快的解析器变体吗?
  • 如果我比如解析一万个元素,那么仅打开和关闭浏览器会花费很长时间
  • 如果您可以访问某种类型的 API,这样您就可以避开 UI,这就是要走的路……如果没有,您也可以尝试使用带有 selenium 的无头浏览器来加快速度,然后尝试并行运行。这些是你可以单独研究的东西,因为 cmets 不是解决这个问题的好地方。希望它能让你走上正确的轨道。祝你好运!
  • 再次感谢,你真的帮了我很多。祝你一切顺利:)
【解决方案2】:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://www.banggood.com/BlitzWolf-Ampcore-Turbo-TC10-3A-Durable-USB-Type-C-Charging-Data-Cable-p-1188424.html?rmmds=category&cur_warehouse=CN") #random url
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "item_now_price"))
    ).text
finally:
    driver.quit()
print(element)

【讨论】:

    猜你喜欢
    • 2011-11-22
    • 2015-09-28
    • 2013-09-09
    • 2021-03-20
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2012-05-06
    相关资源
    最近更新 更多