Как я могу получить текст подкласса HTML с помощью веб-сканера python? Вывод выглядит как пустой массив - PullRequest
2 голосов
/ 07 ноября 2019

Я хочу сканировать текст из подкласса в HTML-теге

с BeautifulSoup, но на выходе получается пустой массив.

Я уже пытался использовать только верхний класс (msg-content-cell) и только подкласс (f1vbk p-msg-head-body) без тега p в конце.

Это моя программа на Python:

class CrawledArticle():
def __init__(self, heading, message):
    self.heading = heading
    self.message = message

class ArticleFetcher():
def fetch(self):
    url = "https://www.verkehrsinformation.de/?road=A8&region=%25"
    articles = []
    time.sleep(1)
    r = requests.get(url)  
    doc = BeautifulSoup(r.text, "html.parser")

    for heading in doc.select(".td-msg-head-heading"):
        heading = heading.select(".td-msg-head-heading")
        for message in doc.select(".msg-content-cell"):
            message = message.select(".msg-content-cell .f1vbk p-msg-head-body p")

            crawled = CrawledArticle(heading, message)
            articles.append(crawled)

    return articles

Вот выдержка из исходного кода HTML, где я хочу сканировать текст "zwischen Beratzhausen (95) und Parsberg (94)"

 </div>
        <div id="a3itHKyCfOGlFAIL" class="table-row newmsg">
        <div class="msg-content-cell">
            <div class="row bg-white cursor-pointer" onclick="window.location.href='/staumeldung/?token=a3itHKyCfOGlFAIL&sp=ro:%|re:2|pg:1'">
                <div class="td-msg-head-heading">
                    <p class="f1vbk p-msg-head-heading">
                        A3 Passau Richtung Nürnberg:
                    </p>
                </div>
                <div class="td-msg-head-info">
                    &nbsp;                    </div>
            </div>
            <div class="row bg-white cursor-pointer" onclick="window.location.href='/staumeldung/?token=a3itHKyCfOGlFAIL&sp=ro:%|re:2|pg:1'">
                <p class="f1vbk p-msg-head-body">
                    zwischen Beratzhausen (95) und Parsberg (94) Wanderbaustelle.&nbsp;
                    <!--<a class="extendlink l1vbku">Mehr</a>...//-->
                </p>
                <p class="p-msg-head-body pull-right f1vbk">
                                        <a class="extendlink l1vbku">Kartenansicht</a>&nbsp;|
                    <a class="extendlink l1vbku">Alle Details</a>
                                    </p>
                                </div>
        </div>

Я ожидаю сканировать текст из подкласса "f1vbk p-msg-head-body" внутри тега

HTML, но на выходе получается пустой массив.

Где разница по сравнению с классом "td-msg-head-heading" и как я могу получить простой текст?

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Может быть, вы можете использовать что-то вроде этого:

doc.find("p", class_="f1vbk p-msg-head-body").string
0 голосов
/ 07 ноября 2019

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

PS Используйте больше описательных имен переменных, чем у меня.

from  bs4 import BeautifulSoup
import requests, time

class CrawledArticle():

    def __init__(self, heading, message):
        self.heading = heading
        self.message = message

class ArticleFetcher():

    def fetch(self):
        url = "https://www.verkehrsinformation.de/?road=A8&region=%25"
        articles = []
        time.sleep(1)
        r = requests.get(url)  
        doc = BeautifulSoup(r.text, "lxml")

        for item in doc.select('.msg-content-cell'):
            heading = item.select_one('.p-msg-head-heading').text.strip()
            message = item.select_one('.msg-content-cell .p-msg-head-body:not(.pull-right)').text.strip()
            crawled = CrawledArticle(heading, message)
            articles.append(crawled)

        return articles

a = ArticleFetcher()
b = a.fetch()
for item in b:
    print(item.heading,'\n' ,item.message)

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

enter image description here

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