【问题标题】:Scraping sitemap index URLs for status code with Beautiful Soup使用 Beautiful Soup 抓取站点地图索引 URL 以获取状态码
【发布时间】:2020-05-13 07:00:01
【问题描述】:

我正在尝试根据以下说明编写脚本:

将所有 URL 抓取到站点地图索引中,并将信息存储到 Excel 文件中,为每个 URL 指定相应的状态代码。

我设法抓取所有 URL 并将它们存储到一个文件中,顺便说一下,我仍在努力寻找获取状态代码的方法。

import requests
from bs4 import BeautifulSoup

url = 'https://www.example-domain.it/sitemap_index.xml'
page = requests.get(url)
print('Loaded page with: %s' % page)

sitemap_index = BeautifulSoup(page.content, 'html.parser')
print('Created %s object' % type(sitemap_index))
urls = [element.text for element in sitemap_index.findAll('loc')]
print(urls)
def extract_links(url):

    page = requests.get(url)
    soup = BeautifulSoup(page.content, 'html.parser')
    links = [element.text for element in soup.findAll('loc')]

    return links

sitemap_urls = []
for url in urls:
    links = extract_links(url)
    r = requests.get(url)
    code = r.status_code
    sitemap_urls += links
    sitemap_urls += code

print('Found {:,} URLs in the sitemap'.format(len(sitemap_urls)))

import pandas as pd
df = pd.DataFrame(sitemap_urls)
df.to_excel("Export_link.xlsx")

谁能帮我修复这个脚本?

我收到此错误:

TypeError: 'int' object is not iterable

问题出在以下几行:

sitemap_urls = []
    for url in urls:
        links = extract_links(url)
        r = requests.get(url)
        code = r.status_code
        sitemap_urls += links
        sitemap_urls += code

如果我只是写:

sitemap_urls = []
    for url in urls:
        links = extract_links(url)
        sitemap_urls += links

脚本正确导出了站点地图索引中的所有 URL,但我必须更进一步:我想为站点地图中包含的每个 URL 获取相应的状态代码。

我怎样才能安排这个迭代来实现它?

【问题讨论】:

  • 运行此程序时是否收到任何错误或任何输出?
  • 嗨,马可!是的,我收到以下错误:TypeError: 'int' object is not iterable
  • 有了完整的输出,我可以肯定,但你可能在这里有一个错误:urls = [element.text for element in sitemap_index.findAll('loc')] .. 因为看起来像不包含您期望的内容,从错误来看,它看起来像 url 它包含一个数字 e 不是您期望的 url 列表
  • 欢迎来到 Stack Overflow!请edit您的帖子包含您对问题的任何其他信息。避免在 cmets 中添加它,因为它们更难阅读并且更容易删除。帖子的编辑按钮就在帖子标签的下方。
  • 我用您要求的信息编辑了帖子:)

标签: python web-scraping beautifulsoup xml-sitemap


【解决方案1】:
import requests
from bs4 import BeautifulSoup
import csv


def main(url):
    with requests.Session() as req:
        r = req.get(url)
        soup = BeautifulSoup(r.content, 'html.parser')
        links = [item.text for item in soup.select("loc")]
        with open("data.csv", 'w') as f:
            writer = csv.writer(f)
            writer.writerow(["Url", "Status Code"])
            for link in links:
                r = req.get(link)
                print(link, r.status_code)
                writer.writerow([link, r.status_code])
                soup = BeautifulSoup(r.content, 'html.parser')
                end = [item.text for item in soup.select("loc")]
                for a in end:
                    r = req.head(a)
                    print(a, r.status_code)
                    writer.writerow([a, r.status_code])


main("https://www.nemora.it/sitemap_index.xml")

【讨论】:

  • 太棒了!这适用于单个站点地图,但在我的情况下,我试图遍历站点地图索引中列出的所有 URL(例如:nemora.it/sitemap_index.xml)。
  • @AlessandraMosconiRomitelli 所以你的问题从一开始就不清楚,然后,按照这种形式,我们只会从一个问题转移到另一个问题。 那么您是否只想处理该特定网站?
  • 不,我从一开始就在谈论站点地图索引(它是站点地图的集合),这只是一个示例。
猜你喜欢
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
相关资源
最近更新 更多