【问题标题】:get tag attributes from specific parents从特定父母那里获取标签属性
【发布时间】:2018-07-27 13:00:49
【问题描述】:

有一个包含许多类似行的 html 代码。首先,我想从 li-tags 中获取所有 ID。这样可行。然后我想只从具有类内容“分组列表”(最后几行)的 div 标记中获取 ID。这不起作用。

HTML:

<ul id="resultListItems">
    <li data-id="102292896">
        <div>
            <article data-item="result" id="result-102292896" data-obid="102292896">
                <div class="result-list-entry__grouped-listings">
                    <a href="/expose/102292896" id="result-102292896" data-go-to-expose-id="102292896" data-go-to-expose-referrer="RESULT_LIST_GROUPED">...</a>
                    <div class="slick-initialized slick-slider">
                        <div class="slick-list draggable">
                            <a href="/expose/102292896" id="result-102292896" data-go-to-expose-id="102292896" data-go-to-expose-referrer="RESULT_LIST_GROUPED">...</a>
                            <div class="slick-track" style="opacity: 1; width: 712px; transform: translate3d(0px, 0px, 0px);">
                               <div class="grouped-listing slick-slide slick-current slick-active grouped-listing--active" style="width: 162px;" data-slick-index="0" aria-hidden="false">
                                  <a href="/expose/104436157" id="result-104436157" data-go-to-expose-id="104436157" data-go-to-expose-referrer="RESULT_LIST_GROUPED">
                                  </a>
                                  <div>
                                  </div>
                               </div>
                               <div class="grouped-listing slick-slide slick-active" style="width: 162px;" data-slick-index="1" aria-hidden="false">
                                  <a href="/expose/104435708" id="result-104435708" data-go-to-expose-id="104435708" data-go-to-expose-referrer="RESULT_LIST_GROUPED">
                                  </a>
                                  <div>
                                  </div>
                               </div>
                               <div class="grouped-listing slick-slide slick-active" style="width: 162px;" data-slick-index="2" aria-hidden="false">
                                  <a href="/Suche/controller/exposeNavigation/goToExpose.go?exposeId=104434267&amp;searchUrl=%2FSuche%2FS-T%2FHaus-Kauf%2FBrandenburg%2FPotsdam&amp;referrer=RESULT_LIST_GROUPED" id="result-104434267" data-go-to-expose-id="104434267" data-go-to-expose-referrer="RESULT_LIST_GROUPED">
                                  </a>
                                  <div>
                                  </div>
                               </div>
                               <div class="grouped-listing slick-slide slick-active" style="width: 162px;" data-slick-index="3" aria-hidden="false">
                                  <a href="/expose/104418108" id="result-104418108" data-go-to-expose-id="104418108" data-go-to-expose-referrer="RESULT_LIST_GROUPED">
                                  </a>
                                  <div>
                                  </div>
                               </div>
                            </div>

运行良好的脚本:

try:
    get_id = soup(url, "html.parser")
    for biglist in get_id.find_all("li", {"data-id": True}):
        if (biglist.parent.get("id") == "resultListItems"):
            my_url = "https://www.abc.de/"+biglist.get("data-id")+"#/"
            print(my_url)

这不起作用:

try:
    get_id = soup(url, "html.parser")
    for biglist in get_id.find_all("a", {"data-go-to-expose-id": True}):
        if (biglist.parent.get("class") == "grouped-listing"):
            my_url = "https://www.abc.de/"+biglist.get("data-id")+"#/"
            print(my_url)

有什么想法吗?

编辑:我的结果显示在这里: 该网页包含更多结果:https://www.immobilienscout24.de/Suche/S-T/Haus-Kauf/Brandenburg/Potsdam

【问题讨论】:

    标签: python-3.x beautifulsoup web-crawler


    【解决方案1】:

    要搜索所有具有"data-go-to-expose-id" 属性的&lt;a&gt; 标签,其父标签为&lt;div&gt;,类"grouped-listing",您可以使用CSS 选择器

    'div.grouped-listing a[data-go-to-expose-id]'
    

    ,像这样:

    data = """
    <ul id="resultListItems">
        <li data-id="102292896">
            <div>
                <article data-item="result" id="result-102292896" data-obid="102292896">
                    <div class="result-list-entry__grouped-listings">
                        <a href="/expose/102292896" id="result-102292896" data-go-to-expose-id="102292896" data-go-to-expose-referrer="RESULT_LIST_GROUPED">...</a>
                        <div class="slick-initialized slick-slider">
                            <div class="slick-list draggable">
                                <a href="/expose/102292896" id="result-102292896" data-go-to-expose-id="102292896" data-go-to-expose-referrer="RESULT_LIST_GROUPED">...</a>
                                <div class="slick-track" style="opacity: 1; width: 712px; transform: translate3d(0px, 0px, 0px);">
                                   <div class="grouped-listing slick-slide slick-current slick-active grouped-listing--active" style="width: 162px;" data-slick-index="0" aria-hidden="false">
                                      <a href="/expose/104436157" id="result-104436157" data-go-to-expose-id="104436157" data-go-to-expose-referrer="RESULT_LIST_GROUPED">
                                      </a>
                                      <div>
                                      </div>
                                   </div>
                                   <div class="grouped-listing slick-slide slick-active" style="width: 162px;" data-slick-index="1" aria-hidden="false">
                                      <a href="/expose/104435708" id="result-104435708" data-go-to-expose-id="104435708" data-go-to-expose-referrer="RESULT_LIST_GROUPED">
                                      </a>
                                      <div>
                                      </div>
                                   </div>
                                   <div class="grouped-listing slick-slide slick-active" style="width: 162px;" data-slick-index="2" aria-hidden="false">
                                      <a href="/Suche/controller/exposeNavigation/goToExpose.go?exposeId=104434267&amp;searchUrl=%2FSuche%2FS-T%2FHaus-Kauf%2FBrandenburg%2FPotsdam&amp;referrer=RESULT_LIST_GROUPED" id="result-104434267" data-go-to-expose-id="104434267" data-go-to-expose-referrer="RESULT_LIST_GROUPED">
                                      </a>
                                      <div>
                                      </div>
                                   </div>
                                   <div class="grouped-listing slick-slide slick-active" style="width: 162px;" data-slick-index="3" aria-hidden="false">
                                      <a href="/expose/104418108" id="result-104418108" data-go-to-expose-id="104418108" data-go-to-expose-referrer="RESULT_LIST_GROUPED">
                                      </a>
                                      <div>
                                      </div>
                                   </div>
                                </div>
    """
    
    
    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(data, 'lxml')
    
    for a in soup.select('div.grouped-listing a[data-go-to-expose-id]'):
        my_url2 = "https://www.abc.de/"+a['data-go-to-expose-id']+"#/"
        print(my_url2)
    

    这将打印:

    https://www.abc.de/104436157#/
    https://www.abc.de/104435708#/
    https://www.abc.de/104434267#/
    https://www.abc.de/104418108#/
    

    【讨论】:

    • 真的很奇怪。你是对的,如果我只运行这个,它是正确的,但是如果我打开真实的网站它只检测到第一个和第二个结果。
    • 也许你可以看看编辑?
    【解决方案2】:

    你在找这个吗?

    get_id = BeautifulSoup(url, "html.parser")
    for biglist in get_id.find_all("a", {"data-go-to-expose-id": True}):
        x = len(biglist.parent.get("class"))
        y = biglist.parent.get("class")
        for i in range(x):
            if (y[i] == "grouped-listing"):
                my_url = "https://www.abc.de/"+biglist.get("data-go-to-expose-id")+"#/"
                print(my_url)
    

    输出:

    https://www.abc.de/102292896#/
    https://www.abc.de/102292896#/
    

    【讨论】:

    • 谢谢。效果更好。我得到了更多结果,但不幸的是不是全部。
    • 我在你的代码sn-p中只看到102292896,可能你需要添加一个适当的例子来帮助我们更好地理解。
    • 我已输入(编辑)真实代码。现在有不同的 ID,我只会从第一个 a-tag 中获取 ID
    • 请同时发布您的示例输出。
    • 只有第一个和第二个:abc.de/104436157#/abc.de/104435708#/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多