从BS4中提取并在Python中存储为列表元素

时间:2018-01-04 05:08:37

标签: python beautifulsoup

我使用BeautifulSoup4从网页中提取了包含在多个HTML p标记内的数据。我已将所有提取的数据存储在列表中。但我想将每个提取的数据作为单独的列表元素用逗号分隔。

HTML内容结构:

<ul>
   <li>
      <p>
        <span class="TextRun">
          <span class="NormalTextrun"> Data 1 </span>
        </span>
      </p>
   </li>
   <li>
      <p>
        <span class="TextRun">
          <span class="NormalTextrun"> Data 2 </span>
        </span>
      </p>
   </li>
   <li>
      <p>
        <span class="TextRun">
          <span class="NormalTextrun"> Data 3 </span>
        </span>
      </p>
   </li>
</ul>

提取代码:

for data in elem.find_all('span', class_="TextRun"):
    data = ''.join([' '.join(item.text.split()) for item in elem.select(".NormalTextRun")])
    data = data.replace(u'\xa0', '')
    events_parsed_thisweek.append(data)
    print (events_parsed_thisweek)

当前输出: [Data1Data2Data3]

预期产量: [Data1,Data2,Data3]

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:2)

data = [x.text.strip() for x in elem.find_all('span', {'class': 'NormalTextrun'})]

打印数据会为您提供:['Data 1', 'Data 2', 'Data 3']

答案 1 :(得分:1)

这应该可以解决您的问题

data = [x.text for x in elem.find_all('span', attrs={'class':'TextRun'})]

答案 2 :(得分:1)

这给出了正确的输出:

data = [ele.text for ele in soup.find_all('span', {'class':'NormalTextrun'})]
print(data)

输出:

[' Data 1 ', ' Data 2 ', ' Data 3 ']

答案 3 :(得分:1)

我认为@Sagun Shrestha的建议是有效的。更详细地处理它,如内部span和额外的空格。也许你应该尝试:

data = [s.text.strip() for s in b.find_all('span', class_='NormalTextrun')]
print(data)

如果您特别希望字符串输出不带引号。你可以试试这个:

data = [s.text.strip() for s in b.find_all('span', class_='NormalTextrun')]
print('[', ', '.join(data), ']', sep='')

希望这就是你想要的。