我有一个循环,把URLs放到我的broswer中,然后刮取它的内容,产生了这样的输出。
2PRACE,0.0014
西班牙裔,0.1556
API,0.0688
黑色,0.0510
AIAN,0.0031
白色,0.7200
代码是这样的。
f1 = open('urlz.txt','r',encoding="utf8")
ethnicity_urls = f1.readlines()
f1.close()
from urllib import request
from bs4 import BeautifulSoup
import time
import openpyxl
import pprint
for each in ethnicity_urls:
time.sleep(1)
scraped = request.urlopen(each)
soup = BeautifulSoup(scraped)
soup1 = soup.select('p')
print(soup1)
resultFile = open('results.csv','a')
resultFile.write(pprint.pformat(soup1))
resultFile.close()
我的问题很简单 但我没有找到任何工具可以帮助我解决这个问题。我想把一个含有"\n "的列表的输出改为:2PRACE,0.0014 Hispanic,0.1556 API,0.0688 Black,0.0510 AIAN,0.0031 White,0.7200。
我使用replace没有成功,因为它告诉我,我把一些元素当作一个元素来处理。我这里的方法是。
for each in ethnicity_urls:
time.sleep(1)
scraped = request.urlopen(each)
soup = BeautifulSoup(scraped)
soup1 = soup.select('p')
soup2 = soup1.replace('\n',' ')
print(soup2)
resultFile = open('results.csv','a')
resultFile.write(pprint.pformat(soup2))
resultFile.close()
你能不能帮我找到正确的方法 在将输出结果写入csv之前进行突变? 我得到的错误信息是: AttributeError: ResultSet对象没有属性'replace'。你可能把一个元素列表当作一个单一的元素。当你想调用find()时,你是否调用了find_all()?
请看我下面的回答中的问题解决方案。谢谢大家的回答
soup1似乎是一个可迭代的变量,所以你不能直接调用replace.相反,你可以循环浏览souple1中的所有字符串项,然后对其中的每一个都调用replace,然后将变化的字符串保存到你的souple2变量中。就像这样。
for e in soup1:
soup2.append(e.replace('\n',' '))
你需要在souple上迭代。
Soup是一个元素列表。
BS4文档是非常好的,有很多很多的例子。https:/www.crummy.comsoftwareBeautifulSoupbs4doc
使用 strip()
去掉 \n
for x in soup1:
for r in x.children:
try:
print(r.strip())
except TypeError:
pass
谢谢两位的想法和资源。我想我可以实现你的建议。目前的构建是
for each in ethnicity_urls:
time.sleep(1)
scraped = request.urlopen(each)
soup = BeautifulSoup(scraped)
soup1 = soup.select('p')
for e in soup1:
soup2 = str(soup1)
soup2 = soup2.replace('\n','')
print(soup2)
resultFile = open('results.csv','a')
resultFile.write(pprint.pformat(soup2))
resultFile.close()
而且效果还不错。我现在可以用excel做最后的调整了。