【问题标题】:I'm not able to write on CSV file using Python's Beautiful Soup我无法使用 Python 的 Beautiful Soup 写入 CSV 文件
【发布时间】:2017-09-04 10:32:14
【问题描述】:

我的目标是编写一个可以从网站检索特定数据的 Python 脚本。

具体来说,我必须提取这些数据:

<span class="street-address" itemprop="streetAddress">191, Corso Peschiera</span>

<div itemprop="telephone" class="tel elementPhone">0184 662271</div>

当然只有号码和地址!

虽然我尝试提取普通的“div”或“a”或“href”,但我没有任何问题,但我无法改进我的研究。

这是我的代码...我无法写入文件,除非我只将soup.find_all('a') 之类的参数传递给bs4

from bs4 import BeautifulSoup
import requests

r = requests.get('https://www.paginegialle.it/ricerca/lidi%20balneari/Torino?')
data = r.text
soup = BeautifulSoup(data,"html.parser")
dia = soup.find_all('<div itemprop="telephone" class="tel elementPhone"></div>')

for link in soup.find_all('<div itemprop="telephone" class="tel elementPhone"></div>'):
    print (dia)

documento=open("mbsprovalive.csv","w")
    documento.write(dia)
        documento.close()

我该如何解决这个问题?

【问题讨论】:

  • 您在哪里读到soup.find_all('&lt;div itemprop="telephone" class="tel elementPhone"&gt;&lt;/div&gt;') 会起作用?你看过这个调用的返回值吗?你看过文档吗?
  • 首先阅读文档:crummy.com/software/BeautifulSoup/bs4/doc/#find-allfind_all() 的第一个位置参数是标签名称,而不是一些 html sn-p。要根据您传入合适的关键字参数或作为attrs arg 的字典的属性进行过滤。
  • @Tomalak 通过文档,我能够构建一个脚本,该脚本可以找到所有“div”或所有“a”,但不是我在答案中所说的更复杂的表达式。
  • 那你还没有阅读文档。

标签: python beautifulsoup python-requests


【解决方案1】:

您可以使用bs4attrs 字段来准确指定您感兴趣的类,如下所示:

#!/usr/bin/env python

from bs4 import BeautifulSoup
import requests 

data = requests.get('your url here').text
soup = BeautifulSoup(data,"html.parser")

for i,j in zip(soup.find_all('span', attrs={'class':'street-address'}), soup.find_all('div', attrs={'class':'tel elementPhone'})):
    print i.text, j.text

这应该可行!

【讨论】:

  • 嗨@coder!求帮助!这是输出 >>> from bs4 import BeautifulSoup >>> import requests >>> >>> data = requests.get('paginegialle.it/ricerca/lidi%20balneari/Roma%20(RM)?').text >>> soup = BeautifulSoup(data,"html.parser") >>> >>> for i,j in zip(soup.find_all('span', attrs={'class':'street-address'}), soup.find_all('div', attrs={'class':'tel elementPhone'})): ... print (i.text, j.text) ... Traceback(最近一次调用最后):文件“”,第 2 行,在 中类型错误:'NoneType' 对象不可调用
  • 我运行您的代码并没有遇到任何问题。问题是在 python 中使用 requests 模块时,您绝不能从 url 中省略 http 部分。因此,通过将数据定义为:data = requests.get('https://www.paginegialle.it/ricerca/lidi%20balneari/Roma%20(RM)?%27').text,您应该没有任何问题!
【解决方案2】:

这是完美运行的代码。只有一些烦人的格式问题。

from bs4 import BeautifulSoup
import requests
import csv
r = requests.get('https://www.paginegialle.it/ricerca/pizzerie/Milano?
mr=50')
data = r.text
soup = BeautifulSoup(data,"html.parser")
with open('mbsprprova.csv', 'w') as csvfile:
fieldnames = ['nome', 'indirizzo', 'telefono']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
for i,j,z in zip(soup.find_all('span', attrs={'class':'street-address'}), soup.find_all('div', attrs={'class':'telelementPhone'}), soup.find_all('span', attrs={'itemprop':'name'})):
    writer.writeheader()
    writer.writerow({'nome': z.text, 'telefono': j.text, 'indirizzo': i.text})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2021-07-22
    • 1970-01-01
    • 2020-04-22
    • 2018-03-26
    相关资源
    最近更新 更多