【问题标题】:Getting value from html with BS4使用 BS4 从 html 中获取价值
【发布时间】:2021-03-18 06:09:10
【问题描述】:

我必须在红框内获得价值。我尝试了这些代码,但每次我尝试新的东西时,它都会给我不相关的答案或异常。网站正在使用 js 加载内容。当我尝试检查 f12 时,我可以看到 html,但我无法使用此代码scrape 内容。

from selenium import webdriver
import time
import bs4


chromedriver = 'D:\webdriverchrome\chromedriver.exe'
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('window-size=1200x600')
browser = webdriver.Chrome(executable_path=chromedriver,                 
chrome_options=options)
browser.get('website')
time.sleep(4)
girisyap = browser.find_element_by_xpath('//*[@id="sign-in-link"]')
time.sleep(3)
girisyap.click()
time.sleep(2)
username = browser.find_element_by_name("loginUsername")
password = browser.find_element_by_name("loginPassword")
username.send_keys("id")
time.sleep(1)
password.send_keys("password")
time.sleep(1)
girrisyap = browser.find_element_by_xpath('//*        
[@id="login"]/div/div/form/div/div/button')
girrisyap.click()
time.sleep(3)
browser.get('logginedwebsite')
time.sleep(15)
innerHTML = browser.execute_script("return document.body.outerHTML")
# html = browser.find_element_by_tag_name('html').get_attribute('innerHTML')
root = bs4.BeautifulSoup(innerHTML, "lxml")
#print(root)
viewcount = root.find_all("span", attrs={'class':'value--2NhHD'})


for span in viewcount:
    print(span.string)

    driver.quit()

这就是输出

Process finished with exit code 0

如果我打印 root,我可以看到一堆 html 代码,但我的值没有任何内容

Image of codes

这个 html 代码是一些 html 代码,当我在登录的网站上使用检查模式时,在 html 和 body 标记内。我想要整个 html 代码中的 26 值。这些值也每 30 秒或 1 分钟更改一次。所以过了一会儿,“26”变成了第二个值。

<div class="numbers--3CyTT recent-number--2rGeB fadeable--1SHS1 all-numbers--1Jc4s">
<div class="number-container--1mKjk recent-number--2E5Lw" data-role="recent-number">
<div data-role="number-26" class="single-number--2nKGX black--2ZXP1 align-middle--30M6J first--2gxHs animate--f-O-R">
***<span class="value--2NhHD">26</span>*** #Need that line
</div></div><div class="number-container--1mKjk recent-number--2E5Lw" data-role="recent-number">
<div class="number-container--1mKjk recent-number--2E5Lw" data-role="recent-number"><div data-role="number-1" class="single-number--2nKGX red--3noFd align-middle--30M6J first--2gxHs animate--f-O-R"><span class="value--2NhHD">1</span></div></div>

【问题讨论】:

  • 不要将代码发布为图像 - 这会使 Stack Overflow 社区更难调试您的问题。相反,将代码的相关部分粘贴到问题的正文中,就像您对 Python sn-p 所做的那样。另见:Why not upload images of code on SO when asking a question?
  • 第二个value--2NhHD 课程你需要那个吗?
  • 不,我只需要第一个整数值。同一类不同的值更多
  • 你能在browser.get('website') time.sleep(4)之后打印browser.page_source吗?看看值是否存在
  • 我更改了代码略有不同,现在我可以看到 html 代码,但它们都不是我想要的。我猜想 js 让获取它变得更加困难。

标签: python web-scraping beautifulsoup


【解决方案1】:

如果您只需要该特定跨度标记的值,而不是使用列表,您可以使用soup.find()

在这种情况下,它将是:

soup = BeautifulSoup(browser.page_source, 'html.parser')
volume = soup.findAll("span", class="value--2NhHD")
value = volume.text

【讨论】:

    【解决方案2】:

    试试下面的

    from bs4 import BeautifulSoup
    
    html = """<div class="numbers--3CyTT recent-number--2rGeB fadeable--1SHS1 all-numbers--1Jc4s">
    <div class="number-container--1mKjk recent-number--2E5Lw" data-role="recent-number">
    <div data-role="number-26" class="single-number--2nKGX black--2ZXP1 align-middle--30M6J first--2gxHs animate--f-O-R">
    <span class="value--2NhHD">26</span>
    </div></div><div class="number-container--1mKjk recent-number--2E5Lw" data-role="recent-number">
    <div class="number-container--1mKjk recent-number--2E5Lw" data-role="recent-number">
    <div data-role="number-1" class="single-number--2nKGX red--3noFd align-middle--30M6J first--2gxHs animate--f-O-R">
    <span class="value--2NhHD">1</span></div></div>"""
    
    soup = BeautifulSoup(html, features="lxml")
    element = soup.select('span.value--2NhHD')[0]
    print(element.text)
    

    打印出来

    26
    

    或者获取全部,运行循环

    soup = BeautifulSoup(html, features="lxml")
    element = soup.select('span.value--2NhHD')
    
    for span in element:
        print(span.text)
    

    【讨论】:

    • 我想我无法澄清我的情况。正如我最近注意到我必须废弃的网站正在使用 javascript 来绑定 html 代码。当我检查它时,它直接给了我 html 源代码,但我的代码给了我“无”或属性错误。
    • 可以发链接吗
    • 我正在使用 Selenium 登录。所以如果我给你网址,它就行不通了。我使用了 soup = BeautifulSoup(browser.page_source,features="html.parse") show = soup.find_all("div") 来显示所有 div,但它没有给出图像中的 div 标签。它给出了别的东西。我也使用了 span 标签。它给了我同样不相关的跨度标签。
    • 我将使用 selenium 编辑问题中的代码,并使用您的代码。这是输出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2014-09-22
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多