【问题标题】:findAll() fails to find any elements within a given parent elementfindAll() 无法在给定的父元素中找到任何元素
【发布时间】:2014-02-25 04:58:25
【问题描述】:

我正在尝试使用 Python 和 BeautifulSoup 从 NCBI 网站提取基因序列。

在从序列页面查看 HTML 时,我注意到序列存储在 span 元素中,该元素存储在 pre 元素中,而div 元素中存储。

我使用findAll() 函数试图提取包含在span 元素中的字符串,但findAll() 函数返回一个空列表。我尝试在父 div 元素上使用 findAll() 函数,虽然它返回有问题的 div 元素,但它在 div 元素中不包含任何 HTML;此外,findAll() 函数返回的 div 元素有些“损坏”,因为打开的 div 标记中的某些属性要么丢失,要么按照 HTML 网页上给出的正确顺序排列。

以下示例代码代表该场景:

实际 HTML:

<div id=viewercontent1 class="seq gbff" val=*some_value* sequencesize=some_sequencesize* virtualsequence style="display: block;">
    <pre>
        "*some gene information enclosed inside double quotation marks*
        "
        <span class="ff_line", id=*some id*>*GENETIC SEQUENCE LINE 1*</span>
        <span class="ff_line", id=*some id*>*GENETIC SEQUENCE LINE 2*</span>
        ...
        <span class="ff_line", id=*some id*>*GENETIC SEQUENCE LINE N*</span>
    </pre>
</div>

我的代码片段:

我的代码的目标是提取pre元素的字符串内容(span字符串和开头的字符串,“*一些基因信息...”)。

# Assume some predefined gene sequence url, gene_url.

page = urllib2.urlopen(gene_url)
soup = BeautifulSoup(page.read())
spans = soup.findAll('span',{'class':'ff_line'})
for span in spans:
    print span.string

这不会打印任何内容,因为spans 列表是空的。如果将findAll 应用于pre 而不是span,则会出现同样的问题。

当我尝试使用与上述相同的过程查找父 div 元素时:

# ...
divs = soup.findAll('div',{'class':'seq gbff'})
for div in divs:
    print div

我得到以下打印输出:

<div class="seq gbff" id="viewercontent1" sequencesize="*some_sequencesize*" val="*some_val*" virtualsequence=""></div>

最明显的区别是打印的结果不包含任何嵌套的 HTML,而且开头的 div 标记内的内容也不同(参数要么丢失,要么顺序错误)。与网页上的等效行比较:

<div id=viewercontent1 class="seq gbff" val=*some_value* sequencesize=some_sequencesize* virtualsequence style="display: block;">

此问题是否与开头 div 标记中的 virtualsequence 参数有关?

我怎样才能达到我想要的目标?

【问题讨论】:

标签: python html beautifulsoup


【解决方案1】:

Class 是 Python 中的保留关键字(在创建对象时使用),因此可能会造成麻烦,您可以尝试在它后面加上下划线并将其作为关键字参数传递,也许这会有所帮助:

>>> soup.find_all('span',class_='ff_line')

Check out the docs.

【讨论】:

    猜你喜欢
    • 2016-07-18
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多