python - разбирать определенное значение в HTML - PullRequest
0 голосов
/ 13 января 2019

Добрый вечер, моя дорогая община. Мой вопрос сегодня вечером следующий: у меня есть этот кусок HTML:

                      <option class="disabled" value="12_654" >
(EU 38 2/3 - US 6)                      </option>
                      <option class="disabled" value="12_3716" >
(EU 39 1/3 - US 6,5)                      </option>
                      <option class="disabled" value="12_636" >
(EU 40 - US 7)                      </option>
                      <option class="" value="12_634" >
EU 40 2/3 - US 7,5                      </option>
                      <option class="" value="12_462" >
EU 41 1/3 - US 8                      </option>
                      <option class="" value="12_460" >
EU 42 - US 8,5                      </option>
                      <option class="" value="12_459" >
EU 42 2/3 - US 9                      </option>
                      <option class="" value="12_458" >
EU 43 1/3 - US 9,5                      </option>
                      <option class="" value="12_457" >
EU 44 - US 10                      </option>
                      <option class="" value="12_456" >
EU 44 2/3 - US 10,5                      </option>
                      <option class="" value="12_455" >
EU 45 1/3 - US 11                      </option>
                      <option class="disabled" value="12_559" >
(EU 46 - US 11,5)                      </option>
                      <option class="disabled" value="12_454" >
(EU 46 2/3 - US 12)                      </option>
                      <option class="disabled" value="12_453" >
(EU 47 1/3 - US 12,5)                      </option>
                    </sel

это всего лишь пример .... Теперь моя цель - найти значение определенного размера, просто указав размер. Например:

Если я укажу, что у меня размер EU 40 - US 7, я хочу проанализировать значение 12_636

Ранее я уже использовал модуль bs4 для разбора HTML и поиска определенных значений, и обычно я делаю это так:

from bs4 import BeautifulSoup as bs

soup=bs(html.text, 'lxml')
v=soup.find('option',{'class':''})['value']

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

v=soup.find('option',(EU 40 - US 7),{'class':''})['value']

Это выглядело так, но да, я знаю, это неправильно. Теперь у меня нет абсолютно никакой идеи о том, как найти значение, поэтому я был бы очень благодарен за любую помощь, которую я получил. Большое спасибо, уважаемое сообщество!

Ответы [ 2 ]

0 голосов
/ 13 января 2019

вы также можете использовать xpath и fromstring.

# import requests
from lxml.html import fromstring
# url = ''
# tree = html.fromstring( requests.get(url).content)
h = '''
 <option class="disabled" value="12_654" >
(EU 38 2/3 - US 6)                      </option>
                      <option class="disabled" value="12_3716" >
(EU 39 1/3 - US 6,5)                      </option>
                      <option class="disabled" value="12_636" >
(EU 40 - US 7)                      </option>
                      <option class="" value="12_634" >
EU 40 2/3 - US 7,5                      </option>
                      <option class="" value="12_462" >
EU 41 1/3 - US 8                      </option>
                      <option class="" value="12_460" >
EU 42 - US 8,5                      </option>
                      <option class="" value="12_459" >
EU 42 2/3 - US 9                      </option>
                      <option class="" value="12_458" >
EU 43 1/3 - US 9,5                      </option>
                      <option class="" value="12_457" >
EU 44 - US 10                      </option>
                      <option class="" value="12_456" >
EU 44 2/3 - US 10,5                      </option>
                      <option class="" value="12_455" >
EU 45 1/3 - US 11                      </option>
                      <option class="disabled" value="12_559" >
(EU 46 - US 11,5)                      </option>
                      <option class="disabled" value="12_454" >
(EU 46 2/3 - US 12)                      </option>
                      <option class="disabled" value="12_453" >
(EU 47 1/3 - US 12,5)                      </option>
                    </sel
'''
tree = fromstring(h)
print(tree.xpath("//option[text()[contains(.,'(EU 40 - US 7)')]]/@value"))
0 голосов
/ 13 января 2019

Создайте dict, сопоставляя каждый текст option с его значением, убирая все лишние пробелы из text:

d = {option.text.strip(): option['value'] for option in soup.find_all('option')}
print(d['(EU 40 - US 7)'])

Результат:

12_636
...