BeautifulSoup 提取不带标签的条纹文本

BeautifulSoup Extract striped Text without Tags

我正在尝试解析来自网站(来自 table)的内容并仅打印来自节点的文本,我正在使用 .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': 'Особенности:'}

我做错了什么?

strip() 删除 尾随 白色 space:

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

为了仅用一个 space 替换多个白色 space 字符,正如您在示例中所做的那样,您可以执行如下操作:

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

你应该使用 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() 并将单元格解包成名称和值对。

请注意,应处理其中一个值 "manually" - "Цена за кв. метр:" 有多个空格 - 我们可以 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.DataFrame objects with pandas.read_html() 是否比尝试更方便使用 BeautifulSoup.

手动解析表