【问题标题】:using beautiful soup to get consolidated data from a list of urls instead of just the first url使用漂亮的汤从 url 列表中获取合并数据,而不仅仅是第一个 url
【发布时间】:2021-12-05 08:12:52
【问题描述】:

我正在尝试获取三个状态的数据,基于相同的 url 格式。

states = ['123', '124', '125']

urls = []
for state in states:
    url = f'www.something.com/geo={state}'
    urls.append(url)

从那里我有三个独立的网址,每个网址都包含不同的状态 ID。

但是当我通过 BS 处理它时,输出只显示来自状态 123 的数据。

for url in urls:
    client = ScrapingBeeClient(api_key="API_KEY")
    response = client.get(url)
    doc = BeautifulSoup(response.text, 'html.parser')

随后我用这个提取了我想要的列:

listings = doc.select('.is-9-desktop')

rows = []

for listing in listings:
    row = {}
    try:
        row['name'] = listing.select_one('.result-title').text.strip()
    except:
        print("no name")
    try:
        row['add'] = listing.select_one('.address-text').text.strip()
    except:
        print("no add")
    try:
        row['mention'] = listing.select_one('.review-mention-block').text.strip()
    except:
        pass
    
    rows.append(row)

但如前所述,它仅显示状态 123 的数据。如果有人能告诉我哪里出错了,不胜感激,谢谢!

编辑

我将 URL 输出添加到列表中,并且能够获取所有三种状态的数据。

doc = []
for url in urls:
    client = ScrapingBeeClient(api_key="API_KEY")
    response = client.get(url)
    docs = BeautifulSoup(response.text, 'html.parser')
    doc.append(docs)

但是当我通过 BS 运行它时,它导致了错误消息:

属性错误:“列表”对象没有属性选择。

我是否通过另一个循环运行它?

【问题讨论】:

  • rows=[] 应该在您遍历 url 列表时首先出现
  • url = f'www.something.com/geo={states}' 应该是url = f'www.something.com/geo={state}'
  • @The_spider 在我看来都一样!
  • states变成state
  • 您每次使用rows=[] 都会重置行。它应该在你的循环之外。

标签: python web-scraping beautifulsoup


【解决方案1】:

它不需要所有这些循环 - 只需遍历状态并将列表附加到行。

最重要的是rows=[]被放置在for循环之外以阻止它覆盖自己。

示例

states = ['123', '124', '125']

rows = []

for state in states:
    url = f'www.something.com/geo={states}'
    client = ScrapingBeeClient(api_key="API_KEY")
    response = client.get(url)
    doc = BeautifulSoup(response.text, 'html.parser')

    listings = doc.select('.is-9-desktop')

    for listing in listings:
        row = {}
        try:
            row['name'] = listing.select_one('.result-title').text.strip()
        except:
            print("no name")
        try:
            row['add'] = listing.select_one('.address-text').text.strip()
        except:
            print("no add")
        try:
            row['mention'] = listing.select_one('.review-mention-block').text.strip()
        except:
            pass

        rows.append(row)

【讨论】:

  • 非常感谢!!!我为此苦苦挣扎,以至于哭了。谢谢!!
猜你喜欢
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
相关资源
最近更新 更多