<br> 标记使用漂亮的汤和 python 从抓取中搞砸了我的数据

Gon*_*o68 3 python csv screen-scraping beautifulsoup

我试图从给定的网站获取高尔夫球场的详细列表。我创建了一个刮板工具来刮取美国不同高尔夫球场的名称和地址。

我的问题是在我能够抓取的地址中。我注意到当刮入我的 CSV 文件时,第一行文本和第二行文本之间没有空格。在 HTML 文件中,我注意到两行文本由<br>标记分隔。

我如何在我的代码中解决这个问题,以便我正在抓取的两行文本在抓取到 CSV 时在它们之间提供一个空格?

这是我试图抓取的 HTML 看起来像这样:

<div class="location">10924 Verterans Memorial Dr<br>Abbeville, Louisiana, United States</div>
Run Code Online (Sandbox Code Playgroud)

我的代码的输出如下所示:

10924 Verterans Memorial DrAbbeville, Louisiana, United States
Run Code Online (Sandbox Code Playgroud)

请注意,“Memorial Dr”和“Abbeville”之间没有空格。如何更改它以便在刮擦时提供空间?

这是我的代码:

import csv
import requests
from bs4 import BeautifulSoup

courses_list = []
geolocator =  ArcGIS ()

for i in range(1):
    url="http://sites.garmin.com/clsearch/courses/search?course=&location=&country=US&state=&holes=&radius=&lang=en&search_submitted=1&per_page={}".format(i*20)
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'lxml')
    #print soup
    g_data2 = soup.find_all("div",{"class":"result"})
    #print g_data2
    for item in g_data2:
        try:
            name = item.find_all("div",{"class":"name"})[0].text
            print name
        except:
            name=''
            print "No Name found!"
        try:
            address= item.find_all("div",{"class":"location"})[0].text
            print address
        except:
            address=''
            print "No Address found!"

course=[name,address]
courses_list.append(course)

with open ('geotest.csv','wb') as file:
     writer=csv.writer(file)
     for row in courses_list:
         writer.writerow(row)
Run Code Online (Sandbox Code Playgroud)

小智 5

textBeautifulSoup 标签的属性返回一个由标签的所有子字符串组成的字符串,使用默认分隔符(空字符串)连接。要替换不同的分隔符,您可以使用该get_text()方法。

考虑address_tag到是<div>有问题:

>>> print address_tag.get_text(separator=' ')
## 10924 Verterans Memorial Dr Abbeville, Louisiana, United States
Run Code Online (Sandbox Code Playgroud)

或重新创建多行:

>>> print address_tag.get_text(separator='\n')
## 10924 Verterans Memorial Dr
## Abbeville, Louisiana, United States
Run Code Online (Sandbox Code Playgroud)

您还可以通过单独提取字符串来完成最后的结果:

>>> for s in at.strings:
...     print s
...
## 10924 Verterans Memorial Dr
## Abbeville, Louisiana, United States
Run Code Online (Sandbox Code Playgroud)