【问题标题】:BeautifulSoup Extract striped Text without TagsBeautifulSoup 提取无标签的条纹文本
【发布时间】:2017-05-25 13:06:33
【问题描述】:

我正在尝试解析来自站点(来自表)的内容并仅打印来自节点的文本,我正在使用 .text.strip() 但它无法正常工作。

我的代码:

import requests
from bs4 import BeautifulSoup

r = requests.get('http://examplesite.net')
soup = BeautifulSoup(r.content, 'lxml')


builddata = soup.find('table', {'id':'BuildData'})

table_elements = builddata.find_all('tr')
for element in table_elements:
    element_dict = {'element_name':element.findChildren()[0].text.strip(), 'element_value':element.findChildren()[1].text.strip()}
    print(element_dict)

结果:

{'element_value': 'Студия;                                                 1-к кв;                                                 2-к кв;                                                 3-к кв;                                                 4-к кв', 
{'element_value': 'Квартира у воды,     \t\t       \t\tЗеленая зона', 'element_name': 'Особенности:'}

有问题的行,应该是这样的:

{'element_value': 'Студия; 1-к кв; 2-к кв; 3-к кв; 4-к кв', 
{'element_value': 'Квартира у воды, Зеленая зона', 'element_name': 'Особенности:'}

我做错了什么?

【问题讨论】:

    标签: python web-scraping beautifulsoup html-parsing


    【解决方案1】:

    您应该将get_text()strip=True 一起使用:

    for element in table_elements:
        name, value = element.find_all("td")[:2]
    
        element_dict = {
            'element_name': name.get_text(strip=True),
            'element_value': ' '.join(value.get_text(strip=True, separator=" ").split())
        }
        print(element_dict)
    

    另外,看看我是如何读取上面代码中的单元格值的 - 使用 find_all() 而不是 findChildren() 并将单元格解包为名称和值对。

    请注意,其中一个值应“手动”处理 - “Цена за кв.метр:”有多个空格 - 我们可以replace them with a single one

    打印:

    {'element_name': 'Район:', 'element_value': 'САО (МСК)'}
    {'element_name': 'Метро:', 'element_value': 'Речной Вокзал , Петровско-Разумовская'}
    {'element_name': 'До метро:', 'element_value': '5.9 км (18 мин на машине) (Посмотреть маршрут)'}
    {'element_name': 'Адрес:', 'element_value': 'Дмитровское шоссе, 107 (Посмотреть на карте)'}
    ...
    {'element_name': 'Разрешение на строительство:', 'element_value': 'Есть'}
    {'element_name': 'Обновлено:', 'element_value': '19 Декабря 2016'}
    {'element_name': 'Особенности:', 'element_value': 'Квартира у воды , Зеленая зона'}
    

    附带说明,如果您在 HTML 解析期间更多地处理表格 HTML 结构,请查看使用 pandas.read_html() 将它们加载到 pandas.DataFrame 对象中是否比尝试使用 @ 手动解析表格更方便987654333@.

    【讨论】:

    • 完美运行,但返回一行是这样的 - 118 017 -\n 147 840
    • @KonstantinRusanov 是的,videl,正在调查,给我一秒钟,谢谢。
    • @KonstantinRusanov 在答案中提到,希望对您有所帮助!
    【解决方案2】:

    strip() 删除 尾随 空格:

    >>> '      test     test         '.strip()
    'test     test'
    

    为了用一个空格替换多个空格字符,就像您在示例中所做的那样,您可以执行以下操作:

    >>> ' '.join('abc                 adsfdf                adsfsaf'.split())
    'abc adsfdf adsfsaf'
    

    【讨论】:

      猜你喜欢
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      相关资源
      最近更新 更多