Python: извлечь класс и текст - PullRequest
0 голосов
/ 11 мая 2018

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

HTML:

<div class="ABC">
    <h3>A</h3>
    <ul>
        <li class="specChecked"><p>CD</p></li>
        <li class="specChecked"><p>VCD</p></li>
        <li class=""><p>CDA</p></li>                       
    </ul>
    <h3>B</h3>
    <div class="buyCarDetailContentSpecContent ">
        <ul>
        <li>
            <p>b1<span>1</span></p>
        </li>
        <li>
            <p>b2<span>2</span></p>
        </li>
        </ul>
    </div>
</div>

Мой код:

res = requests.get('https://www.acd.com/carinfo-4434.php')
soup=BeautifulSoup(res.text,'lxml')
for item in soup.find_all(attrs={'class':'ABC'}):       
    for link in item.find_all('li'):
        print(link)

Из моегокод, я извлеку все ли из HTML, как это:

<li class="specChecked"><p>CD</p></li>
<li class="specChecked"><p>VCD</p></li>
<li class=""><p>CDA</p></li> 
<li>
    <p>b1<span>1</span></p>
</li>
<li>
    <p>b2<span>2</span></p>
</li>

Но это не то, что я хочу.То, что я хочу сделать, это извлечь из "li class" и текста, надеюсь, что результат будет таким:

specChecked, CD
specChecked, VCD
, CDA

(Или, может быть, я могу просто заменить specChecked как 1 и пробел как 0)

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вы можете сделать что-то вроде ниже, чтобы получить содержимое желаемого класса вместе с пустым.

from bs4 import BeautifulSoup

content = """
<div class="ABC">
    <h3>A</h3>
    <ul>
        <li class="specChecked"><p>CD</p></li>
        <li class="specChecked"><p>VCD</p></li>
        <li class=""><p>CDA</p></li>                       
    </ul>
    <h3>B</h3>
    <div class="buyCarDetailContentSpecContent ">
        <ul>
        <li>
            <p>b1<span>1</span></p>
        </li>
        <li>
            <p>b2<span>2</span></p>
        </li>
        </ul>
    </div>
</div>
"""
soup = BeautifulSoup(content, "html.parser")
for item in soup.find_all('li',class_=["specChecked",""]):
    print("{}, {}".format(' '.join(item['class']),item.text))

Выход:

specChecked, CD
specChecked, VCD
, CDA
0 голосов
/ 11 мая 2018
s = """<div class="ABC">
    <h3>A</h3>
    <ul>
        <li class="specChecked"><p>CD</p></li>
        <li class="specChecked"><p>VCD</p></li>
        <li class=""><p>CDA</p></li>                       
    </ul>
    <h3>B</h3>
    <div class="buyCarDetailContentSpecContent ">
        <ul>
        <li>
            <p>b1<span>1</span></p>
        </li>
        <li>
            <p>b2<span>2</span></p>
        </li>
        </ul>
    </div>
</div>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(s, "html.parser")
for link in soup.find_all('li'):
    if link.has_attr("class"):
        print(link.get("class", ""), link.text)

Выход:

[u'specChecked'], u'CD'
[u'specChecked'], u'VCD'
[u''], u'CDA'
  • Вы можете использовать has_attr, чтобы проверить, имеет ли li атрибут класса
  • link.get для получения значения класса
  • link.text для извлечения текста.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...