如何将XML站点地图转为可索引列表并实现链接抓取?
解决XML站点地图转列表及链接抓取问题
我看了你的代码,问题主要出在两个地方:一是get_urls()函数没有返回URL列表,导致你没法把结果存成可索引的列表;二是解析XML站点地图的方式有点绕,而且用html.parser解析XML可能会出问题。咱们一步步改:
1. 修复get_urls()函数,让它返回URL列表
原来的get_urls()里直接循环调用retuned_objects(url),但没有返回任何内容,所以lst = [get_urls()]其实得到的是[None],自然没法用lst[0]访问有效链接。咱们让函数先收集所有URL,再返回这个列表:
2. 正确解析XML站点地图
XML站点地图要用XML解析器,比如xml.parser或者lxml(需要先安装lxml库),比html.parser更靠谱。而且提取<loc>标签的内容不用那么复杂的字符串分割,直接用.text就能拿到。
修改后的完整代码
from bs4 import BeautifulSoup import requests def get_urls(): baseurl = 'https://link/sitemap.xml' request = requests.get(baseurl) # 用XML解析器解析,而不是html.parser soup = BeautifulSoup(request.content, 'xml') search_html = soup.find_all('url') # 直接提取loc标签的文本,简单又可靠 results_list = [item.find('loc').text.strip() for item in search_html] # 返回URL列表,而不是直接遍历调用函数 return results_list def scrape_url(url): # 这里写你的抓取逻辑,比如获取标题 try: response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') # 按你给的示例代码抓取标题 title = soup.find_all("div", {"class":"large-7 medium-9 columns"})[0].h1.text print(f"URL: {url}, 标题: {title}") except Exception as e: print(f"抓取{url}出错: {str(e)}") # 获取URL列表 url_list = get_urls() # 现在你可以正常访问列表元素了 print("第一个链接:", url_list[0]) print("第二个链接:", url_list[1]) # 遍历所有链接进行抓取 for url in url_list: scrape_url(url)
关键改动说明
- 返回列表:
get_urls()现在返回收集到的所有URL,这样url_list = get_urls()就能得到一个可索引的列表,你可以用url_list[0]、url_list[1]直接访问单个链接。 - XML解析器:把解析器从
html.parser改成xml,BeautifulSoup会自动用合适的XML解析器处理,避免HTML解析带来的问题。 - 简化提取逻辑:用
item.find('loc').text.strip()直接获取<loc>标签里的URL,比字符串分割更稳定。 - 拆分功能:把URL收集和内容抓取分成两个独立函数,逻辑更清晰,也方便调试。
这样你就能正常调用列表里的每个元素,对每个链接执行抓取操作啦~
内容的提问来源于stack exchange,提问作者jacquelinerherrera
相关产品推荐
相关产品推荐

