Python 3 Beautifulsoup: получить значение тега span с указанным c текстом, который также случайно помещается в дерево html - PullRequest
0 голосов
/ 20 апреля 2020

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

Сценарий : мне нужно проанализировать цены на различные товары, которые генерируются случайным образом в зависимости от ввода пользователя, см. Код ниже:

<div class="sk-expander-content" style="display: block;">

<ul>
  <li>
    <span>Third Party Liability</span>
    <span>€756.62</span>
  </li>

  <li>
  <span>Fire &amp; Theft</span>
  <span>€15.59</span>
  </li>

</ul>
</div>

Если эти параметры были сохранены c и всегда будет отображаться в одной и той же позиции в пределах html, было бы легко пересмотреть цены, но, поскольку они могут быть размещены в любом месте в пределах div sk-expander-content, я не уверен, как их найти в Dynami c way.

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

Первое, что пришло на ум, - следующий код, но я Я не уверен, достаточно ли он надежен или имеет смысл:

html = driver.page_source
soup = BeautifulSoup(html, "html.parser")

div_i_need = soup.find_all("div", class_="sk-expander-content")[1]

def price_scraper(text_to_find):
    for el in div_i_need.find_all(['ul', 'li', 'span']):
        if el.name == 'span':
            if el[0].text == text_to_find:
                return(el[1].text)

Ваша помощь будет высоко оценена.

Ответы [ 2 ]

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

Используйте регулярное выражение.

import re

html='''<div class="sk-expander-content" style="display: block;">

<ul>
  <li>
    <span>Third Party Liability</span>
    <span>€756.62</span>
  </li>

  <li>
  <span>Fire &amp; Theft</span>
  <span>€15.59</span>
  </li>

</ul>
</div>
<div class="sk-expander-content" style="display: block;">

<ul>
  <li>
    <span>Fire &amp; Theft</span>
    <span>€756.62</span>
  </li>

  <li>
  <span>Third Party Liability</span> 
  <span>€15.59</span>
  </li>

</ul>
</div>'''

soup = BeautifulSoup(html, "html.parser")

for item in soup.find_all(class_="sk-expander-content"):

    for span in item.find_all('span',text=re.compile("€(\d+).(\d+)")):
        print(span.find_previous_sibling('span').text)
        print(span.text)

Выход :

Third Party Liability
€756.62
Fire & Theft
€15.59
Fire & Theft
€756.62
Third Party Liability
€15.59

ОБНОВЛЕНИЕ : Если вы хотите получить первым значение узла. Затем используйте find() вместо find_all().

import re

html='''<div class="sk-expander-content" style="display: block;">

<ul>
  <li>
    <span>Third Party Liability</span>
    <span>€756.62</span>
  </li>

  <li>
  <span>Fire &amp; Theft</span>
  <span>€15.59</span>
  </li>

</ul>
</div>
<div class="sk-expander-content" style="display: block;">

<ul>
  <li>
    <span>Fire &amp; Theft</span>
    <span>€756.62</span>
  </li>

  <li>
  <span>Third Party Liability</span> 
  <span>€15.59</span>
  </li>

</ul>
</div>'''

soup = BeautifulSoup(html, "html.parser")

for span in soup.find(class_="sk-expander-content").find_all('span',text=re.compile("€(\d+).(\d+)")):
    print(span.find_previous_sibling('span').text)
    print(span.text)
0 голосов
/ 20 апреля 2020
from bs4 import BeautifulSoup
import re

html = """
<div class="sk-expander-content" style="display: block;">

<ul>
  <li>
    <span>Third Party Liability</span>
    <span>€756.62</span>
  </li>

  <li>
  <span>Fire &amp; Theft</span>
  <span>€15.59</span>
  </li>

</ul>
</div>
"""

soup = BeautifulSoup(html, 'html.parser')

target = soup.select("div.sk-expander-content")

for tar in target:
    data = [item.text for item in tar.findAll("span", text=re.compile("€"))]
    print(data)

Вывод:

['€756.62', '€15.59']

Примечание: я использовал select, которые возвращают ResultSet, чтобы найти все div.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...