findAll()无法在给定的父元素中找到任何元素

时间:2014-02-01 12:26:24

标签: python html beautifulsoup

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

从序列页面查看HTML后,我注意到序列存储在span元素中,pre元素存储在div元素中存储的findAll()元素中。

我尝试使用span函数来拉取findAll()元素中包含的字符串,但findAll()函数返回一个空列表。我试图在父div元素上使用div函数,并且在返回有问题的div元素时,它不包含div内的任何HTML元素此外,findAll()函数返回的div元素有点“损坏”,因为开放<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> 标记中的某些属性要么丢失,要么按正确的顺序丢失。 HTML网页。

以下示例代码代表了该方案:

实际HTML:

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>

我得到以下打印输出:

div

最明显的区别是打印结果不包含任何嵌套HTML,但开放<div id=viewercontent1 class="seq gbff" val=*some_value* sequencesize=some_sequencesize* virtualsequence style="display: block;"> 标记内的内容也不同(参数缺失或顺序错误)。与网页上的等效行比较:

virtualsequence

此问题是否与开场div代码中的{{1}}参数有关?

我怎样才能实现我的目标?

1 个答案:

答案 0 :(得分:2)

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

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

Check out the docs.