【问题标题】:How to fetch data inside </br> tag which is inside <li> using python scraping如何使用python抓取在<li>内的</br>标签内获取数据
【发布时间】:2018-02-12 03:13:08
【问题描述】:
<div class="row features_2 "><br />
        <ul>

                    <li><b>Área privada:</b><br />
                    70,00 m²
                    </li>

            <!--area-->

                    <li><b>Área Const.:</b><br />
                    70,00 m²
                    </li>

            <!--precio metro cuadrado-->

                <li><b>Precio m²:</b><br />
                3.142.857/m²
                </li>

            <!--Valor noche si es alquiler vacacional-->

            <!--precio de administracion -->

                    <li><b>Admón:</b><br />
                    $150,000</li>

            <!--Estrato si aplica-->

                <li><b>Estrato:</b> <br />
                3

            <!--Estado si aplica-->

                <li><b>Estado:</b> <br />
                    Excelente
                </li>

            <!--edad si aplica-->

                <li><b>Antigüedad:</b> <br />
                1 a 8 años</li>

            <!--piso #-->

            <!--Clima-->

            <!--tipo de apartamento si aplica-->

            <!--para parqueaderos-->
            <!--caracteristicas parqueadero-->

            <!--Sector (siempre va)-->
            <li><b>Sector:</b> <br />

                <a href="#pnlMap" style="font-weight: bold;">Ver Mapa</a>

            </li>  


        </ul>

从上面我想获取标签内的值,但是我在将值保存到单个列表时遇到了麻烦。

我想根据自身内部的数据保存值。

例如,如果标签包含“Área privada:”,那么我必须将值“70,00 m²”保存到列表名称区域

如果标签包含 'Precio m²:' ,那么我必须将值 3.142.857/m² 保存到名为 Precio 的列表中

我尝试了以下代码来获取元素,但不确定如何根据上述条件编写将数据保存到列表中的条件。

import requests
from bs4 import BeautifulSoup
page = requests.get('https://www.fincaraiz.com.co/oceana-52/barranquilla/proyecto-nuevo-det-1041165.aspx')
soup = BeautifulSoup(page.content, 'lxml')
box_3 = soup.find('div' ,'row features_2 ')
box_3_1  = box_3.findAll('li')
for i in box_3_1:
    print (i)

还有其他选项可以将上述标签中的数据保存到相应的列表中。

【问题讨论】:

  • br 标签不包含任何数据..
  • html 看起来很混乱。
  • 所以只添加了python代码从网页中获取html元素

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


【解决方案1】:

使用&lt;br&gt;next_sibling 属性:

for li in box_3_1:
    print(str(li.br.next_sibling).strip())

输出:

71,00 a 185,00 m²
78,00 a 207,00 m²
5
Cálido

OP 希望将“Área”和“Precio”数据存储在不同的列表中。假设这两个字符串永远不会出现在同一个 &lt;li&gt; 标题中,这是一个完整的解决方案:

area = []
precio = []
for li in box_3_1:
    heading_words = li.b.text.split()
    target_content = str(li.br.next_sibling).strip()
    if "Área" in heading_words:
        area.append(target_content)
    elif "Precio" in heading_words:
        precio.append(target_content)

对于更通用的解决方案,请考虑制作关键标题术语列表,然后将所有输出存储在 dict 中。例如:

import re

key_terms = ["Área", "Precio", "Estrato"]
data = {k:[] for k in key_terms}

for li in box_3_1:
    heading = li.b.text
    target_content = str(li.br.next_sibling).strip()
    for term in key_terms:
        # Headers like "Estrato:" do not match on split() due to end ":"; use re instead.
        if re.search(term, heading):
            data[term].append(target_content)          
data
{'Estrato': ['5'],
 'Precio': [],
 'Área': ['71,00 a 185,00 m²', '78,00 a 207,00 m²']}

【讨论】:

  • 所以你也可以使用字典(或者如果你想要超过 1 个项目,则使用字典列表)来存储你的东西。如果你做一个 soup.find_all('li') 它应该同时保存由冒号分隔的值和键。如果你循环遍历结果(记得去掉 ekstra 空格和所有),然后执行 .text.split(':'),那么你将在索引 0 处获得键,在索引 1 处获得值。所以如果你有一个 result_dict ,您只需插入类似 result_dict[your_list[0]] = your_list[1] 的内容。
  • 谢谢,我在更新的答案中使用了您建议的修改版本。
  • 谢谢你,andrew_reece,它对我很有效,我很高兴你在这个问题上对我的支持
  • 不客气!如果此答案解决了您的问题,请单击答案左侧的复选标记将其标记为已接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
相关资源
最近更新 更多