【问题标题】:Web scraping - can't locate element text data-wipe name网页抓取 - 找不到元素文本数据擦除名称
【发布时间】:2020-12-14 15:05:47
【问题描述】:

我想抓取一些开放数据,但我不断收到元素没有文本属性值的错误。在我在谷歌上测试之前,我可以通过这种方式轻松地在课堂上获取文本。我也用 xpath 测试它,我知道“nobr”标签在 html 中是多个标签,这就是问题所在,但通常可以用 xpath 跳转

driver.get('https://www.gelbeseiten.de/Suche/dm-drogerie%20markt/Bundesweit')
time.sleep(3)
plz = driver.find_element_by_class_name("nobr").text
plzx = driver.find_element_by_xpath("/html/body/div[2]/div[2]/div/div/div[1]/div/div/div/div[2]/div/article[59]/a/address/p[1]/span").text
print(plzx)

唯一的问题是用元素定位文本???我想遍历页面元素以用它填充 pd 中的这些列

#this was working if I scrape just by one value through page

product_titles = driver.find_elements_by_class_name('nobr')
for title in product_titles:
    print(title.text)


#i want to save the scraped data later  

df = pd.DataFrame([[name,plz.street,city,number]],columns['business','plz','street','city','number'])
     


这是我要抓取的信息的部分


            <a href="https://www.gelbeseiten.de/gsbiz/cf5182f8-e6ba-4846-a1f2-0d179feb68c4" data-realid="cf5182f8-e6ba-4846-a1f2-0d179feb68c4" data-tnid="162004776014" target="_self">
                
        <div class="mod-hervorhebung">
    </div>
        
        <h2 data-wipe-name="Titel">dm-drogerie markt GmbH + Co. KG</h2>
        <p class="d-inline-block mod-Treffer--besteBranche">
            Drogeriewaren
        </p>
        
                    <div class="bewertungen-anker">
                    <div class="mod mod-Stars mod-Stars--" title="5.0/5" data-float="5,0">

        <span class="mod-Stars__text" style="width: 100%;">5.0</span>

    </div>
                    <span>5.0</span>
                    <span>(2)</span>
                    </div>
        <address class="mod mod-AdresseKompakt">
        <p data-wipe-name="Adresse">
            Geisenheimer&nbsp;Str.&nbsp;70, 
            <span class="nobr">
                65385
                Rüdesheim&nbsp;am&nbsp;Rhein
            </span>
        </p>

        <p class="mod-AdresseKompakt__phoneNumber" data-hochgestellt-position="end" data-wipe-name="Kontaktdaten">06722 40 63 70</p>

    </address>
    
        <div class="oeffnungszeit_kompakt__zustandsinfo--geoeffnet">
            <span>Geöffnet</span>, 
            <span class="nobr">schließt um 20:00</span>
        </div>
            </a>
        <div class="mod mod-Aktionsleistekompakt">
        <div class="mod mod-gsSlider mod-gsSlider--noneOnWhite">
            <span class="mod-gsSlider__arrow mod-gsSlider__arrow--arrow" data-direction="left" data-show="false" data-wipe="{&quot;listener&quot;:&quot;click&quot;,&quot;name&quot;:&quot;Trefferliste: Slider-Pfeil-links&quot;}"></span>
            <span class="mod-gsSlider__arrow mod-gsSlider__arrow--arrow" data-direction="right" data-show="false" data-wipe="{&quot;listener&quot;:&quot;click&quot;,&quot;name&quot;:&quot;Trefferliste: Slider-Pfeil-rechts&quot;}"></span>
            <div class="mod-gsSlider__slider">
            <span class="contains-icon-route gs-btn" data-wipe="{&quot;listener&quot;:&quot;click&quot;, &quot;name&quot;:&quot;Trefferliste Navigation-Button&quot;, &quot;id&quot;:&quot;162004776014&quot;}" data-parameters="{&quot;partner&quot;: &quot;googlemaps&quot;, &quot;searchquery&quot;: &quot;Geisenheimer%20Str%2070%2065385%20R%C3%BCdesheim%20am%20Rhein&quot;}" data-target="_blank">Route</span>
            <a class="contains-icon-details gs-btn" rel="noopener" href="https://www.gelbeseiten.de/gsbiz/cf5182f8-e6ba-4846-a1f2-0d179feb68c4" data-wipe="{&quot;listener&quot;: &quot;mouseup&quot;, &quot;name&quot;: &quot;Trefferliste Actionbutton Mehr Details&quot;, &quot;id&quot;: &quot;162004776014&quot;, &quot;synchron&quot;: false}" data-isneededpromise="false" data-cookieinfo="cf5182f8-e6ba-4846-a1f2-0d179feb68c4=162004776014">Mehr Details</a>
            <div class="mod-gsSlider__spacer"></div>
            </div>
        </div>
    
</div>
            

【问题讨论】:

    标签: python html python-3.x selenium-webdriver


    【解决方案1】:

    你可以试试

    element = driver.find_element_by_class_name('nobr')
    plz = element.get_attribute('innerText')
    

    或直接:

    plz = driver.find_element_by_class_name('nobr').get_attribute('innerText')
    

    因为文本是 HTML 元素的 innerText 属性。

    因为find_elements_by_class_name返回一个列表,所以不能直接使用get_attribute。您需要编写一个 for 循环,例如:

    product_titles = driver.find_elements_by_class_name('nobr')
    for title in product_titles:
        print(title.get_attribute("innerText"))
       #print(title.text)
    

    哪个适合你。

    上次编辑:与 XPath 相同

    product_titles = driver.find_elements_by_xpath("//span[contains(@class, 'nobr')]")
    for title in product_titles:
        print(title.text)
    

    【讨论】:

    • 但是我怎样才能通过该页面循环所有 nobr 元素文本。获取 AttributeError: 'list' 对象没有属性 'get_attribute' 如果我在 plz print(adresses) 中使用带有地址的元素
    • 我不明白你的意思是什么
    • 我的意思是我不能将内部文本与 ,,driver.find_elements 一起使用,这只是为了从一个带有 ,,driver.find_element 的 nobr 中获取内部文本,通常当我废弃我刚刚使用的谷歌时, , adresses = driver.find_elements_by_class_name('class') for plz in adresses: print(plz.text) `` 循环通过 `google maps 并获取所有商店名称或其他内容。但是在那个页面上这不起作用。
    • 我添加了我想到的解决方案,尽管我不确定。我希望这能解决你的问题。请记住find_elements_by_class_namefind_element_by_class_name 之间存在差异。前者返回一个列表,后者返回一个对象。
    • 感谢你的代码是完美的,但在你编辑之前,我用循环测试同样的结果,仍然得到 AttributeError: 'list' object has no attribute 'text'''' 我真的不知道为什么它不是工作是否最终导致 nobr 和 nobr 的超类在该页面上过多?还是使用 xpath 更好?并感谢您的努力
    猜你喜欢
    • 2020-01-23
    • 1970-01-01
    • 2022-01-14
    • 2021-09-25
    • 1970-01-01
    • 2021-10-09
    • 2022-01-19
    • 2021-07-06
    • 1970-01-01
    相关资源
    最近更新 更多