【发布时间】: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 参数有关?
我怎样才能达到我想要的目标?
【问题讨论】:
-
试试这个答案,这对你有帮助:stackoverflow.com/questions/12466900/…
标签: python html beautifulsoup