我正在尝试使用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}}参数有关?
我怎样才能实现我的目标?
答案 0 :(得分:2)
Class是Python中的保留关键字(在创建对象时使用),因此可能会造成麻烦,您可以尝试通过下划线跟随它并将其作为关键字参数传递,这可能会有所帮助:
>>> soup.find_all('span',class_='ff_line')