使用python BeautifulSoup从html中提取某个内容

时间:2017-06-10 18:08:56

标签: python

我一直试图提取

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>&nbsp;&nbsp;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关联的标记,并获取有机体名称

3 个答案:

答案 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>&nbsp;&nbsp;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>&nbsp;&nbsp;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>&nbsp;&nbsp;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