我一直试图提取
Bacillus circulans
来自以下html:
<tr><th class="th10" align="left" valign="top" style="border-color:#000; border-width: 1px 0px 0px 1px; border-style: solid"><nobr>Organism</nobr></th>
<td class="td10" style="border-color:#000; border-width: 1px 1px 0px 1px; border-style: solid"><div style="width:555px;overflow-x:auto;overflow-y:hidden"><a href="/kegg-bin/show_organism?tax=1397">ag</a> Addendum (Bacillus circulans)<br>
</div></td></tr>
但我不确定它在哪个标签以及如何进入该标签。
感谢您的帮助。
谢谢你, XP
编辑:我实际上是想从KEGG addenlum页面获得bacillus circulans
import urllib
from bs4 import BeautifulSoup as BS
url = 'http://www.kegg.jp/entry/ag:CAA27061'
page = urllib.urlopen(url).read()
soup = BS(page, 'html.parser')
tags = soup('div')
for i in tags.contents:
print i
以上是我所知道的怎么做。由于有更多的生物需要检索,我不认为我可以使用&#39; re&#39;匹配模式。我想找到一个与Addenlum org
关联的标记,并获取有机体名称
答案 0 :(得分:0)
from bs4 import BeautifulSoup as soup
html='''<tr><th class="th10" align="left" valign="top" style="border-color:#000; border-width: 1px 0px 0px 1px; border-style: solid"><nobr>Organism</nobr></th>
<td class="td10" style="border-color:#000; border-width: 1px 1px 0px 1px; border-style: solid"><div style="width:555px;overflow-x:auto;overflow-y:hidden"><a href="/kegg-bin/show_organism?tax=1397">ag</a> Addendum (Bacillus circulans)<br>
</div></td></tr>'''
html=soup(html)
print(html.text)
打印的简单方法
Organism
ag Addendum (Bacillus circulans)
然后你可以
print(html.text.split('(')[1].split(')')[0])
打印环状芽孢杆菌
答案 1 :(得分:0)
您可以使用bs4和正则表达式执行此操作。
BeautifulSoup Part
from bs4 import BeautifulSoup
h = """
<tr><th class="th10" align="left" valign="top" style="border-color:#000;
border-width: 1px 0px 0px 1px; border-style: solid"><nobr>Organism</nobr>
</th>
<td class="td10" style="border-color:#000; border-width: 1px 1px 0px 1px;
border-style: solid"><div style="width:555px;overflow-x:auto;overflow-
y:hidden"><a href="/kegg-bin/show_organism?
tax=1397">ag</a> Addendum (Bacillus circulans)<br>
</div></td></tr>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
您的内容位于<div>
标记内。
tag = soup.find('div')
t = tag.text #'ag\xa0\xa0Addendum (Bacillus circulans)\n'
正则表达式部分
import re
m = re.match(('(.*)\((.*)\).*', t)
ans = m.group(2) #Bacillus circulans
答案 2 :(得分:0)
通常的预赛。
>>> import bs4
>>> soup = bs4.BeautifulSoup('''\
... <tr><th class="th10" align="left" valign="top" style="border-color:#000; border-width: 1px 0px 0px 1px; border-style: solid"><nobr>Organism</nobr></th><td class="td10" style="border-color:#000; border-width: 1px 1px 0px 1px; border-style: solid"><div style="width:555px;overflow-x:auto;overflow-y:hidden"><a href="/kegg-bin/show_organism?tax=1397">ag</a> Addendum (Bacillus circulans)<br></div></td></tr>''', 'lxml')
然后我prettify
soup
了解我的反对意见。
>>> for line in soup.prettify().split('\n'):
... print(line)
...
<html>
<body>
<tr>
<th align="left" class="th10" style="border-color:#000; border-width: 1px 0px 0px 1px; border-style: solid" valign="top">
<nobr>
Organism
</nobr>
</th>
<td class="td10" style="border-color:#000; border-width: 1px 1px 0px 1px; border-style: solid">
<div style="width:555px;overflow-x:auto;overflow-y:hidden">
<a href="/kegg-bin/show_organism?tax=1397">
ag
</a>
Addendum (Bacillus circulans)
<br/>
</div>
</td>
</tr>
</body>
</html>
我可以看到您想要的字符串是构成contents
元素的div
的三个项目之一。我的第一步是识别该元素,并使用其style
属性。
>>> parentDiv = soup.find('div', attrs={"style":"width:555px;overflow-x:auto;overflow-y:hidden"})
我检查了contents
中的三个项目,我提醒说字符串没有name
;它是None
。
>>> for item in parentDiv.contents:
... item, item.name
...
(<a href="/kegg-bin/show_organism?tax=1397">ag</a>, 'a')
('\xa0\xa0Addendum (Bacillus circulans)', None)
(<br/>, 'br')
然后隔离我可以使用的字符串:
>>> BC_string = [_ for _ in parentDiv.contents if not _.name]
>>> BC_string
['\xa0\xa0Addendum (Bacillus circulans)']
编辑:根据评论中的信息,这是如何处理一个页面。找到“有机体”的标题(在nobr
元素中),然后查找包含与该元素相关的所需文本的div
。从contents
的{{1}}的其他元素中过滤掉字符串,然后使用正则表达式获取有机体的带括号的名称。如果正则表达式失败,则提供整个字符串。
div