【问题标题】:BeautifulSoup returning different html than view sourceBeautifulSoup 返回与查看源不同的 html
【发布时间】:2015-01-02 00:20:59
【问题描述】:

我是使用 BeautifulSoup 的新手,如果我的问题很愚蠢,请原谅我。但是,从早上 6 点开始,我一直在谷歌搜索并尝试在每个 stackoverflow 线程中提出建议,但无济于事。

我的问题是我有一个带有基因名称的 .csv 文件,其中一些是 ensEMBL 格式,这意味着我必须使用 ensembl 数据库来查找我需要的信息。其余的我可以使用 ncbi 数据库。

现在,我的代码很好。我知道这一点,因为发送到 ncbi 的每个查询都会返回我需要的信息,并且我可以使用 BeautifulSoup 提取所有信息并将其输出到 csv。但是,urlopen 或 BeautifulSoup 都没有按照我被引导理解它们工作的方式工作。

当我将以下 URL 放入地址栏中时,会加载正确的网页:http://uswest.ensembl.org/Gallus_gallus/Gene/Summary?db=core;g=ENSGALG00000016955;r=1:165302186-165480795;t=ENSGALT00000027404

然后我可以查看源代码并签出 HTML。然而,当我有:

html = urlopen(http://uswest.ensembl.org/Gallus_gallus/Gene/Summary?db=core;g=ENSGALG00000016955;r=1:165302186-165480795;t=ENSGALT00000027404, 'lxml')

当我在浏览器中加载相同的 URL 并查看源代码时,它输出的 HTML 完全不是我得到的。我知道对于带有 javascript 的页面,inspect 元素和查看源代码会有所不同,但 urlopen 应该始终返回与查看源代码相同的 HTML。

我需要提取“描述”之后的字符串。在我的浏览器中访问链接,我可以检查源代码并查看我需要使用 BeautifulSoup 找到的标签;但是,除非 urlopen 正常工作并返回正确的 HTML,否则我无能为力。我的 RA 工作取决于今晚之前完成。

有什么建议吗?

【问题讨论】:

    标签: python-2.7 web-scraping beautifulsoup


    【解决方案1】:

    页面的某些部分由脚本标签中引用的 Javascript 加载,例如“摘要”。但是,您要查找的文本嵌入在 HTML 中。使用此代码定位描述标记后的文本:

    import requests
    from bs4 import BeautifulSoup
    
    url = "http://uswest.ensembl.org/Gallus_gallus/Gene/Summary?db=core;g=ENSGALG00000016955;r=1:165302186-165480795;t=ENSGALT00000027404"
    r = requests.get(url, timeout=5)
    html = BeautifulSoup(r.text)
    description = html.find("div", {'class': "rhs"})
    print description.text
    

    【讨论】:

    • 效果非常好。由于我对网络抓取/抓取是全新的,因此任何信息都确实有帮助。您能否分享为什么“requests.get(url)”和 html = BeautifulSoup(r.text) 返回我在右键单击并查看源代码时看到的 HTML,但 html = openurl(ensemblURL) 没有?非常感谢。
    • 嗯,我不知道,我也不打算调查,但现在每个人都在使用 requests 模块而不是 urllib,因为它更容易使用。我很确定你可以让它与 urllib 一起工作,但为什么要经历这样的麻烦呢?
    • 也请您将我的答案标记为正确。
    • 抱歉没有标注!堆栈交换的新手,当我看到我无法支持您的答案时,我认为我无法用它做任何其他事情。您是否建议我用请求替换所有使用 urllib2 的请求,即使是 urllib2 工作的请求?
    • 我想我会这样做。这大概也会简化您的代码。
    猜你喜欢
    • 2019-01-08
    • 2021-05-19
    • 1970-01-01
    • 2013-05-30
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2015-07-07
    相关资源
    最近更新 更多