BeautifulSoup: извлекать данные из текста после определенного промежутка - PullRequest
0 голосов
/ 06 апреля 2020

Я знаю, что есть множество подобных вопросов, но я просто не могу понять мой конкретный c пример.

На этой странице, я хочу извлечь число '121 320' из строки: 'Масса (Да): 121 320'

Я вижу из BeautifulSoup, что это именно то, что я хочу:

</div><a class="show-link" href="#" id="O00203-show-link" style="display:none">Show »</a></div><div class="sequence-isoform-rightcol"><div><span class="sequence-field-header tooltiped" title="Sequence length.">Length:</span><span>1,094</span></div><div><span class="sequence-field-header tooltiped" title="The mass of the unprocessed protein, in Daltons.">Mass (Da):</span><span>121,320</span>

Я пытался это:

import urllib
import requests
import sys
from bs4 import BeautifulSoup

uniprot_list = ['O00203']
for each_id in uniprot_list:
        data = requests.get('https://www.uniprot.org/uniprot/' + each_id + '#sequences.html')
        soup = BeautifulSoup(data.content, 'html.parser')


        #prints all spans
        print(soup.find_all('span'))

        #prints empty list
        print(soup.find_all('span',title_='The mass of the unprocessed protein, in Daltons.'))

Самым близким, что я получил, была попытка следовать этому ответу на SO:

    div1 = soup.find("div", { "class" : "sequence-isoform-rightcol" }).findAll('span', { "class" : "sequence-field-header tooltiped" })
    for x in div1:
            print(x.text)

Проблема в том, что распечатывается:

Length:
Mass (Da):

без фактических значений.

Как извлечь массу из каждой имеющейся у меня страницы? В этом случае 121 320?

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Вы можете использовать регулярное выражение re для поиска в тексте, а затем использовать find_next('span')

import re
import urllib
import requests
import sys
from bs4 import BeautifulSoup

uniprot_list = ['O00203']
for each_id in uniprot_list:
        data = requests.get('https://www.uniprot.org/uniprot/' + each_id + '#sequences.html')
        soup = BeautifulSoup(data.content, 'html.parser')
        print(soup.find('span',text=re.compile("Mass")).find_next('span').text)

Вывод :

121,320

Или, если вы имеют Bs4 4,7 и выше, тогда вы можете использовать следующий селектор css.

import urllib
import requests
import sys
from bs4 import BeautifulSoup

uniprot_list = ['O00203']
for each_id in uniprot_list:
        data = requests.get('https://www.uniprot.org/uniprot/' + each_id + '#sequences.html')
        soup = BeautifulSoup(data.content, 'html.parser')
        print(soup.select_one('span:contains("Mass (Da)")').find_next('span').text)

Выход :

121,320
1 голос
/ 06 апреля 2020
from bs4 import BeautifulSoup
data = '''
<html>
<body>
</div><a class="show-link" href="#" 
id="O00203showlink"style="display:none">Show»</a</div><div class="sequence-isoform- 
rightcol"><div><span class="sequence-field-header tooltiped" title="Sequence 
length.">Length:</span><span>1,094</span></div><div><span class="sequence-field-header 
tooltiped" title="The mass of the unprocessed protein, in Daltons.">Mass (Da):</span> 
<span>121,320</span>'
</body>
</html>
''' 


soup = BeautifulSoup(a,'lxml')
span_text = [x.text for x in soup.findAll('span')]
#op
 ['Length:', '1,094', 'Mass (Da):', '121,320']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...