BeautifulSoup提取没有标签的条纹文本

时间:2017-01-10 21:50:04

标签: python web-scraping beautifulsoup html-parsing

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

我做错了什么?

2 个答案:

答案 0 :(得分:2)

您应该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.DataFrame将它们加载到pandas.read_html()对象中是否比尝试手动解析更方便表格为BeautifulSoup

答案 1 :(得分:0)

strip()删除尾随空格:

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

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

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