使用Python解析Yahoo RSS Feed时,如何正确获取link元素的内容?
解决Yahoo RSS Feed中Link内容无法正确提取的问题
我之前也碰到过requests_html处理RSS里这类特殊标签的坑,特别是它把<link>...</link>解析成自闭合<link/>、文本内容跑到标签外面的情况,给你几个可行的解决思路:
方法1:用XPath提取Link标签后的兄弟文本节点
因为requests_html已经把原link标签解析成了自闭合节点,实际的链接文本是它的后续兄弟文本节点,可以通过XPath精准定位:
import pandas as pd from requests_html import HTMLSession session = HTMLSession() url = "你的Yahoo RSS Feed地址" response = session.get(url) items = response.html.find("item", first=False) data = [] for item in items: # 提取title title = item.find('title', first=True).text # 提取link:定位link标签后的第一个文本节点 link = item.xpath('./link/following-sibling::text()')[0].strip() # 提取source source = item.find('source', first=True).text data.append({"title": title, "link": link, "source": source}) df = pd.DataFrame(data) print(df)
方法2:直接对Item的HTML字符串做正则匹配
如果XPath用着不顺手,也可以把item的HTML转换成字符串后,用正则匹配<link/>之后的内容:
import re import pandas as pd from requests_html import HTMLSession session = HTMLSession() url = "你的Yahoo RSS Feed地址" response = session.get(url) items = response.html.find("item", first=False) data = [] for item in items: item_html = item.html # 匹配<link/>之后到下一个标签前的内容 link_match = re.search(r'<link/>(.*?)(?=<)', item_html) link = link_match.group(1).strip() if link_match else None title = item.find('title', first=True).text source = item.find('source', first=True).text data.append({"title": title, "link": link, "source": source}) df = pd.DataFrame(data)
方法3:换用专门的RSS解析库(推荐)
requests_html主要是为HTML页面设计的,处理RSS这类XML格式的内容容易出问题。更省心的方式是用feedparser——专门针对RSS/Atom格式的解析库,能完美处理这类标签:
import feedparser import pandas as pd url = "你的Yahoo RSS Feed地址" feed = feedparser.parse(url) # 提取所需字段 data = [] for entry in feed.entries: entry_data = { "title": entry.title, "link": entry.link, "source": entry.source.get("title") if hasattr(entry, "source") else None } data.append(entry_data) df = pd.DataFrame(data) print(df)
总结
优先推荐用feedparser,它能避开XML解析的各种奇怪问题;如果一定要用requests_html,XPath的方式比正则更可靠,不易出现匹配错误。
内容的提问来源于stack exchange,提问作者xdo
相关产品推荐
相关产品推荐

