【问题标题】:Python 3 BeautifulSoup Strip Specific Values from a Span Class?Python 3 BeautifulSoup 从跨度类中剥离特定值?
【发布时间】:2018-12-10 02:49:35
【问题描述】:

我已经测试了我在这里找到的几个不同的答案,但似乎无法解决我的问题。希望有人能帮忙。

我在 Python 3 环境中使用 BeautifulSoup 4 进行抓取。在我正在抓取的网站上,我试图在同一跨度类中获取文本的特定值。 span 类说:

<span class="TeamChip__teamName--1renR">MIL</span> <span class="TeamChip__teamName--1renR">CIN</span>

(我正在尝试获取的团队名称)。

当我使用 find 函数时,它会将两个名称刮到输出 csv 中的一个字符串中,但我想要一个解决方案,它通过使用某种分隔符将它们分开,或者放入它们的单元格中(无论哪个)。现在它以 MILCIN 的形式出现,我希望它类似于 MIL,CIN。

这是我的 Python 代码,我尝试过的一些解决方案被注释掉了:

from bs4 import BeautifulSoup
import csv

with open('BoxScoreURLS.csv', newline='') as f_urls, open('output.csv', 'w', `newline='') as f_output:`
csv_urls = csv.reader(f_urls)
csv_output = csv.writer(f_output)
csv_output.writerow(['Teams', 'Box Score'])

for line in csv_urls:
    r = requests.get(line[0]).text
    soup = BeautifulSoup(r, 'lxml')
    teams = soup.find("span", {"class":"TeamChip__teamName--1renR"})
    print('Teams :', teams.text)
    #person = {}

    #for span in soup.findAll('span', {'class': '.TeamChip__teamName--1renR'}):
    #   person[span.find('p').attrs['class'][0]] = span.text.strip()

    #print(person)

    print([item.get_text(strip=True) for item in soup.findAll("span.TeamChip__teamName--1renR")])
    #teams = soup.find("div", {"class":"TeamChip__teamName"}).
    #print('Teams :', teams.text)


    csv_output.writerow([teams.text])

输出写入 csv 很好,但它将两个值写入一个字符串 (MILCIN),但我希望它是 (MIL,CIN),以便我可以更轻松地清理数据。这种方法也适用于分数,所以我不能只接受一个excel公式来分割数据。

非常感谢!如果我能回答更多问题,请告诉我。

【问题讨论】:

  • 您的代码示例缺少确切分配给 teams 变量的内容,但在我看来,打印语句中的内容可能是写入行参数中的内容。
  • 我相信这可能是你的答案here
  • 感谢音带。我尝试将 print 命令中的内容放入 writerow 中,但它没有向输出返回任何内容?你是对的,我在粘贴代码时遇到了问题。这是缺少的一点。我会尝试将其添加到我的原始帖子中。团队 = soup.find("span", {"class":"TeamChip__teamName--1renR"}) print('Teams :', teams.text)

标签: python html beautifulsoup


【解决方案1】:

我在这个例子中使用了请求。我已经在这里测试了代码并且它可以工作。我唯一没有测试的是输出到 csv 文件。所以如果它仍然不起作用,我会假设它是输出的方式。

from bs4 import BeautifulSoup
import requests

page = requests.get("http://your-site.com")
soup = BeautifulSoup(page.content, 'html.parser')
results = soup.findAll('span', {'class' :'TeamChip__teamName--1renR'})
for r in range(len(results)):
    csv_output.writerow([results[r].text])

【讨论】:

  • 是的,这行得通。必须在顶部重新添加导入 csv,我将更改页面变量,以便它来自具有 url 列表的我的 csv,但输出有效。它将两个团队名称放在各自的行中。非常感谢!
  • 既然这个答案有效,你能把它标记为正确答案吗?
【解决方案2】:

是的,这有效。必须在顶部重新添加导入 csv,我将更改页面变量,以便它来自具有 url 列表的我的 csv,但输出有效。它将两个团队名称放在各自的行中。非常感谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    相关资源
    最近更新 更多