Ищите элемент в строке и возвращайте элемент + следующие два символа - PullRequest
0 голосов
/ 23 апреля 2020

Следующее html выглядит как строка в моем коде. Это нормально, но мне нужно, как получить:

"class =" company-image company-34 ""

для каждой компании - ## также есть цена, найденная в этот тег далее ниже в HTML:

class = "small-12 medium-4 cell text-right" data-after = "kr./år"> 1.813

Я попробовал следующий код:

for x in html:   
    if "company-image company" in x:
        print("Oh yes")
    else:
        print("Nahh")

, но на самом деле он не работает. Я думаю, что я ищу каждый раз, когда упоминается «компания-имиджевая компания», и получаю всю строку и следующие числа после, это всегда два числа ##. И всякий раз, когда это найдено, я ищу "data-after =" kr./år "" и получаю следующие числа. В конце концов это закончится в течение l oop, так как есть несколько компаний и цены.

<app-offer-match _ngcontent-vdv-c20="" _nghost-vdv-c22="" class="ng-star-inserted">
    <div _ngcontent-vdv-c22="" class="box">
        <!---->
        <div _ngcontent-vdv-c22="" class="line1">
            <div _ngcontent-vdv-c22="" class="company-image company-34"><img _ngcontent-vdv-c22="" src="/assets/images/companies/34.svg"></div>
            <div _ngcontent-vdv-c22="" class="button compare">Sammenlign </div>
        </div>
        <div _ngcontent-vdv-c22="" class="line2">
            <div _ngcontent-vdv-c22="" class="container-button">
                <div _ngcontent-vdv-c22="" class="button mini-accordion"></div>
            </div>
            <div _ngcontent-vdv-c22="" class="container-insurance-list">
                <!---->
                <div _ngcontent-vdv-c22="" class="indbo ng-star-inserted">
                    <div _ngcontent-vdv-c22="" class="grid-x container-product-overview">
                        <div _ngcontent-vdv-c22="" class="small-5  cell detail"><span _ngcontent-vdv-c22="">Indbo</span>
                            <!----><span _ngcontent-vdv-c22="" class="ng-star-inserted">Kongshaven 3</span>
                        </div>
                        <div _ngcontent-vdv-c22="" class="small-6  cell">
                            <div _ngcontent-vdv-c22="" class="grid-x price">
                                <div _ngcontent-vdv-c22="" class="small-12 medium-8  cell text-right" data-after="kr.">Selvrisiko 2.199</div>
                                <div _ngcontent-vdv-c22="" class="small-12 medium-4  cell text-right" data-after="kr./år">1.813 </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</app-offer-match>

РЕДАКТИРОВАТЬ: Добавлен желаемый вывод. Желаемым выводом будет pandas кадр данных:

Company                   Price
company-image company-34  1.813

РЕДАКТИРОВАТЬ 2: Он выглядит как xml, потому что я отформатировал его для вас, ребята. Когда я вывожу его, он типа STR, спасибо.

1 Ответ

0 голосов
/ 24 апреля 2020

Попробуйте:

company = """[your string above]"""

import lxml.html as lh
import pandas as pd

doc = lh.fromstring(company)

columns = ["Company", "Price"]
rows = []
targets = doc.xpath('//div[contains(@class,"company-image company")]')
for target in targets:
    row = []
    row.append(target.attrib['class'])
    price = target.xpath('../following-sibling::div//div[@data-after="kr./år"]')[0]
    row.append(price.text)
    rows.append(row)
rows
pd.DataFrame(rows,columns=columns)

Вывод:

Company     Price
0   company-image company-34    1.813
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...