【问题标题】:Extracting text from span从跨度中提取文本
【发布时间】:2020-01-23 10:34:42
【问题描述】:

我有一个关于 span 标签的问题,它没有 id 或 class。 更大的方法是从下面的链接中提取“ITEM 1. BUSINESS”到“ITEM 1A. RISK FACTORS”之间的文本。但是,我无法找到找到这部分的方法,因为它所在的跨度没有 id 也没有我可以搜索的类(只有跨度所在的父 div:div = soup.find("div", {"id": "dynamic-xbrl-form"})

此代码不起作用,遗憾的是:#text = unicodedata.normalize('NFKD', soup.get_text()).replace('\n', '')

这是我的方法:

url = 'https://www.sec.gov/ix?doc=/Archives/edgar/data/934549/000093454919000017/actg2018123110-k.htm#s62CF0831C63E51C2BEF33F4163F1DE65'
raw = requests.get(url)
soup = BeautifulSoup(raw.content)

div = soup.find("span", {"id": ... })
print(div.txt)

你有什么想法或提示吗?

非常感谢 朱利叶斯

【问题讨论】:

    标签: python html beautifulsoup text-extraction


    【解决方案1】:

    正如@Gagan 所说,网站的内容是从 Javascript 加载的。你需要使用Selenium

    使用 Selenium 比其他 Python 功能更强大。我使用的是 ChromeDriver 所以如果你还没有安装你可以安装它

    http://chromedriver.chromium.org/

    from  selenium import webdriver
    
    driver_path = r'your driver path'
    browser = webdriver.Chrome(executable_path=driver_path)
    browser.get("https://www.sec.gov/ix?doc=/Archives/edgar/data/934549/000093454919000017/actg2018123110-k.htm#s62CF0831C63E51C2BEF33F4163F1DE65")
    datas = browser.find_elements_by_css_selector("span") // use # or . for class or id name like span#id_name , span.class_name
    
    for spans in datas:
        print(spans.text)
    

    你也可以获取所有源码

    print (browser.page_source)
    

    【讨论】:

    • 嘿,我之前也尝试过 selenium 方法,但是使用 find_elements_by_xpath,但是我无法通过此特定链接 (sec.gov) 找到任何带有“class: col-sm”的 div -12”或“id=dynamic-xbrl-form”。尽管具有这些属性的 div 显然在 html 代码中。具体来说,我使用了以下代码:driver.find_element_by_xpath("//div[@id='dynamic-xbrl-form']") 但我只收到“无法定位元素”错误。通常这确实让我得到了正确的结果。可悲的是,我实际上正在寻找的跨度既没有“id”也没有“class”!
    【解决方案2】:

    此页面的内容是从JavaScript 加载的,您不能为此使用BeautifulSoup。为此目的使用selenium

    【讨论】:

    • 感谢您的回复。你知道我需要什么功能吗?带有“查找”的东西?
    【解决方案3】:

    在我的情况下,我正在使用 span 标签的 id 检查,这解决了我的问题:

    import requests
    from bs4 import BeautifulSoup
    URL = 'https://www.facebook.com/hackerv728'
    page = requests.get(URL)
    soup = BeautifulSoup(page.content, 'html.parser')
    titles = soup.find_all('span', id='fb-timeline-cover-name')
    for title in titles:
        print(title.text.strip())
    

    【讨论】:

    • 谢谢,但没用。 div.text 也不是有效的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2021-01-07
    • 2018-01-24
    • 1970-01-01
    • 2020-06-01
    • 2016-10-13
    • 1970-01-01
    相关资源
    最近更新 更多