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
.
手动解析表
我正在尝试解析来自网站(来自 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
.