Как получить каждое значение в тегах <li>и <span>, используя python - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь удалить некоторые данные с сайта https://www.cellartracker.com/m/wines/12344. Я не могу понять, как получить каждое значение, которое не принадлежит ни одному классу в теге. Ниже приведен код сайта, который я ищу:

<ul class="twin-set-list">
        <li><span>Vintage</span> 2000</li>
        <li><span>Type</span> Red</li>
        <li><span>Producer</span> Balnaves of Coonawarra</li>
        <li><span>Varietal</span> Cabernet Sauvignon</li>
        <li><span>Designation</span> The Tally Reserve</li>
        <li><span>Vineyard</span> n/a</li>
        <li><span>Country</span> Australia</li>
        <li><span>Region</span> South Australia</li>
        <li><span>SubRegion</span> Limestone Coast</li>
        <li><span>Appellation</span> Coonawarra</li>
    </ul>

Значения типа 2000, красный и т. Д. Не имеют никакого класса, так что я могу использовать для получения данных. Я пробовал следующий код (только HTML часть приведена ниже) в Python:

    from bs4 import BeautifulSoup

html = """<ul class="twin-set-list">
            <li><span>Vintage</span> 2000</li>
            <li><span>Type</span> Red</li>
            <li><span>Producer</span> Balnaves of Coonawarra</li>
            <li><span>Varietal</span> Cabernet Sauvignon</li>
            <li><span>Designation</span> The Tally Reserve</li>
            <li><span>Vineyard</span> n/a</li>
            <li><span>Country</span> Australia</li>
            <li><span>Region</span> South Australia</li>
            <li><span>SubRegion</span> Limestone Coast</li>
            <li><span>Appellation</span> Coonawarra</li>
        </ul>"""

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

need = {}

for li_tag in soup.find_all('ul', {'class':'twin-set-list'}):
    for span_tag in li_tag.find_all('li'):
        field = span_tag.find('span').text
        value = span_tag.find('span').text
        need[field] = value

print(need)

Может кто-нибудь посоветовать мне, как мне извлечь эти данные?

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Вы можете заменить свой код на:

field = span_tag.find('span').text 
value = span_tag.text.replace(field,'')

Он не очень чистый, но работает с вашим кодом.

0 голосов
/ 30 октября 2018

Может быть, вы можете попробовать это:

for li_tag in soup.find_all('ul', {'class':'twin-set-list'}):
for span_tag in li_tag.find_all('li'):
    field = span_tag.find('span').text
    value = span_tag.text
    value = value[len(field)+1:]
    need[field] = value

На всякий случай, если у вас есть то же поле в «значении», не заменяйте его, а вместо этого используйте подстроку.

0 голосов
/ 30 октября 2018

Вы можете перебрать атрибут contents объекта bs4:

from bs4 import BeautifulSoup as soup
d = [[getattr(c, 'text', c).strip() for c in i] for i in soup(html, 'html.parser').find_all('li')]

Выход:

[['Vintage', '2000'], ['Type', 'Red'], ['Producer', 'Balnaves of Coonawarra'], ['Varietal', 'Cabernet Sauvignon'], ['Designation', 'The Tally Reserve'], ['Vineyard', 'n/a'], ['Country', 'Australia'], ['Region', 'South Australia'], ['SubRegion', 'Limestone Coast'], ['Appellation', 'Coonawarra']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...