【问题标题】:How can I get BeautifulSoup info in the same row?如何在同一行中获取 BeautifulSoup 信息?
【发布时间】:2021-04-27 11:14:19
【问题描述】:

我目前正在网页抓取,并希望获得同一行的规格。当我目前打印它时,第 2 列看起来像这样:

text
text
text
text
text

我想把它全部放在这样的同一行

text text text text text

这样我以后可以在 Excel 中将其分成不同的列。

是否有我可以使用的转置命令或其他什么?

代码:

导入请求

from bs4 import BeautifulSoup
import csv


with open('Oslo.csv', 'w', newline='') as f:
    fieldnames = ['column1', 'column2']
    skriver = csv.DictWriter(f, fieldnames=fieldnames)
    skriver.writeheader()


    def data(page_number):
        URL = 'https://www.url.com/' + str(
            page_number) + '&sort=PUBLISHED_DESC'

        page = requests.get(URL)

        soup = BeautifulSoup(page.content, 'html.parser')

        ads = soup.findAll('h2', class_="ads__unit__content__title ads__unit__content__title--fav-placeholder")

        for data in ads:
            id = data.find('a')
            link = (id['id'])
            url = 'https://www.url.com/'+str(link)
            page = requests.get(url)
            soup = BeautifulSoup(page.content, 'html.parser')
            ads = soup.findAll('div', class_="u-word-break")
            for stats in ads:
                address = stats.find('p', class_="u-caption")
                specs = stats.find('dl', class_="definition-list definition-list--cols1to2")

                skriver.writerow({'column1': address.text.strip(), 'column2': specs.text})
    for x in range(1, 2):
        data(x)
print('Ferdig, du kan åpne oslo.csv')

编辑:从网站上抓取是非法的,所以我删除了 URL。

【问题讨论】:

  • 分享 URL 或使用您正在工作的 HTML 示例编辑您的问题,否则无法重现。
  • @baduker 我现在已经发布了完整的脚本

标签: python-3.x csv web-scraping beautifulsoup


【解决方案1】:

您的specs.text 是一个包含\n 换行符的字符串。您可以将其拆分,然后仅用一个空格将其连接回来。即' '.join(specs.text.split())

import requests
from bs4 import BeautifulSoup
import csv


with open('Oslo.csv', 'w', newline='') as f:
    fieldnames = ['column1', 'column2']
    skriver = csv.DictWriter(f, fieldnames=fieldnames)
    skriver.writeheader()


    def data(page_number):
        URL = 'https://www.url.com/' + str(page_number) + '&sort=PUBLISHED_DESC'

        page = requests.get(URL)

        soup = BeautifulSoup(page.content, 'html.parser')

        ads = soup.findAll('h2', class_="ads__unit__content__title ads__unit__content__title--fav-placeholder")

        for data in ads:
            id = data.find('a')
            link = (id['id'])
            url = 'https://www.url.com/'+str(link)
            page = requests.get(url)
            soup = BeautifulSoup(page.content, 'html.parser')
            ads = soup.findAll('div', class_="u-word-break")
            for stats in ads:
                address = stats.find('p', class_="u-caption")
                specs = stats.find('dl', class_="definition-list definition-list--cols1to2")

                address = ' '.join(address.text.split()) 
                specs = ' '.joins(specs.text.split())   #<-- changed here
                
                skriver.writerow({'column1': address, 'column2': specs})

    for x in range(1, 2):
        data(x)
        
print('Ferdig, du kan åpne oslo.csv')

【讨论】:

  • 感谢您的回复!但是,它似乎没有将文本放在同一行上。不过,谢谢您的时间。我还删除了 prispanel 线
  • 分享网址。或者告诉我你的意思。这应该有效。
  • 我唯一可以假设/认为的另一件事是,您将同一行与不在同一行上混淆了。如果文本有\n,这意味着它被打印在一个新的行上(但是它在同一行上)。我对代码做了些许调整。所以试试看,看看是什么样子。
  • 我现在已经发布了完整的脚本。我想我想把它放在同一条线上。对不起,我的用词错误
  • 是的。这就是发生的事情。 specs 文本带有换行符。只需在空白处拆分,然后加入它们。试试我上面修改的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
相关资源
最近更新 更多