分别获取父文本和子文本并将它们存储在字典中

Get the parent text and child one separately and store them in dictionary

假设我有这个 html,

<span class="name">
  <span class="age">21</span>
  Will Green
</span>

我想提取 nameage 文本并将它们存储到字典中。

到目前为止,我已经能够获得 age,但很难获得 name

这是我到目前为止尝试过的方法。

with open('test.html', 'r') as file:
    contents = file.read()    
    soup = BeautifulSoup(contents, 'html.parser')
    
    name = soup.find(class_="name").getText()
    age = soup.find("span", class_="age").getText()

    results = {}
    results['name'] = name
    results['age'] = age

    print(results)

输出为{'name': '\n21\n Will Green\n ', 'age': '21'}

如您所见,name 给了我一些奇怪的字符、空格以及子元素的文本。

我该如何解决这个问题?

预期输出{'name': 'Will Green', 'age': '21'}

事实上,结构仍然相同,您可以使用 stripped_stringszip() 它与预期的 keys:

dict(zip(['age','name'],soup.select_one('span.name').stripped_strings))

另一种方法是先 select 年龄,然后 next_sibling:

{
    'age': soup.select_one('span.age').text,
    'name':soup.select_one('span.age').next_sibling.get_text(strip=True)
}
例子
html='''
<span class="name">
  <span class="age">21</span>
  Will Green
</span>
'''
from bs4 import BeautifulSoup 

soup = BeautifulSoup(html)
dict(zip(['age','name'],soup.select_one('span.name').stripped_strings))
输出
{'age': '21', 'name': 'Will Green'}