BeautifulSoup: выберите div из вложенного раздела и элементы div - PullRequest
0 голосов
/ 29 сентября 2018

как мне извлечь содержимое div ['field-item'], являющееся дочерним по отношению к разделу с классом "field-name-field-mpd-total -acity"?Я работаю над https://rbnenergy.com/node/6081 для справки.

<section class="field-name-field-mpd-total-capacity">
    <h2 class="field-label">Total Capacity:&nbsp;</h2>
    <div class="field-items">
        <div class="field-item even">125 Mb/d</div>
    </div>
</section>
</td>

Возможно, уже слишком поздно для мозговых волн на меня.Вот мой пример кода:

import requests
from bs4 import BeautifulSoup
html = """
    <section class="field-name-field-mpd-total-capacity"><h2 class="field-label">Total Capacity:&nbsp;</h2><div class="field-items"><div class="field-item even">125 Mb/d</div></div></section>          </td>
    """
soup = BeautifulSoup(html, 'lxml')
out = soup.find("section", { "class" : "field-item" })
print(out)

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Попробуйте:

import requests
from bs4 import BeautifulSoup

html = """
    <section class="field-name-field-mpd-total-capacity"><h2 class="field-label">Total Capacity:&nbsp;</h2><div class="field-items"><div class="field-item even">125 Mb/d</div></div></section>          </td>
    """

soup = BeautifulSoup(html, 'lxml')
for allz in soup.findAll("section", { "class" : "field-name-field-mpd-total-capacity" }):
    print(allz.find("div", { "class" : "field-item"}).string)

Он также будет работать напрямую из веб-источника.Используйте что-то вроде

page = requests.get("https://example.com/node/") для этого

0 голосов
/ 29 сентября 2018

Попробуйте это:

>>> from bs4 import BeautifulSoup
>>> 
>>> html = """
...     <section class="field-name-field-mpd-total-capacity"><h2 class="field-label">Total Capacity:&nbsp;</h2><div class="field-items"><div class="field-item     even">125 Mb/d</div></div></section>          </td>
...     """
>>>
>>> soup = BeautifulSoup(html, 'lxml')
>>> out = soup.find("div", { "class" : "field-item" })
>>> print(out)
<div class="field-item even">125 Mb/d</div>
>>> out.text
'125 Mb/d'

Первый аргумент find - это ( обычно ) имя элемента, который будет найден.В приведенном примере произойдет сбой, так как в указанном классе нет элемента section.Вы можете изменить его на div для достижения желаемого результата.

Чтобы извлечь элементы данных из section с элементами класса field-name-field-mpd-total-capacity, вы можете использовать:

>>> from bs4 import BeautifulSoup
>>>
>>> html = '''<section class="field-name-field-mpd-total-capacity"><h2 class="field-label">Total Capacity:&nbsp;</h2><div class="field-items"><div class="field-item even">125 Mb/d</div></div></section>          </td>'''
>>> soup = BeautifulSoup(html, 'lxml')
>>> section = soup.find('section', {'class': 'field-name-field-mpd-total-capacity'})
>>> [x.text for x in section.find_all('div', {'class': 'field-item'})]
['125 Mb/d']

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

import requests
from bs4 import BeautifulSoup

response = requests.get('https://rbnenergy.com/node/6081')
soup = BeautifulSoup(response.text, 'lxml')

data = {}

for element in soup.find_all("section", { "class" : "field" }):
    key = element.find('h2', {'class': 'field-label'})
    content = element.find('div', {'class': 'field-items'}).text

    data[key.text.rstrip(':\xa0')] = content

print(data)

Пример вывода:

{'Operator': 'Rangeland', 'Commodity': 'Crude Oil', 'Stage': 'Operational', 'Project Type': 'New Build', 'In Service Date': 'Q3/2016', 'Diameter': '12 inches', 'Length': '109 miles', 'Base Capacity': '125 Mb/d', 'Total Capacity': '125 Mb/d', 'Origin': 'Orla, TXUnited States', 'Destination': 'Midland, TXUnited States'}
...