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