我正在尝试用 Rust 构建一个基本的网络爬虫,我正在尝试将其移植到 html5ever .截至目前,我有一个内部结构应该返回 Vec<String>
的函数。 .它得到这个 Vec
来自 return 语句中的结构。为什么它总是返回一个空向量? (跟生命周期参数有关系吗?)
fn find_urls_in_html<'a>(
original_url: &Url,
raw_html: String,
fetched_cache: &Vec<String>,
) -> Vec<String> {
#[derive(Clone)]
struct Sink<'a> {
original_url: &'a Url,
returned_vec: Vec<String>,
fetched_cache: &'a Vec<String>,
}
impl<'a> TokenSink for Sink<'a> {
type Handle = ();
fn process_token(&mut self, token: Token, _line_number: u64) -> TokenSinkResult<()> {
trace!("token {:?}", token);
match token {
TagToken(tag) => {
if tag.kind == StartTag && tag.attrs.len() != 0 {
let _attribute_name = get_attribute_for_elem(&tag.name);
if _attribute_name == None {
return TokenSinkResult::Continue;
}
let attribute_name = _attribute_name.unwrap();
for attribute in &tag.attrs {
if &attribute.name.local != attribute_name {
continue;
}
trace!("element {:?} found", tag);
add_urls_to_vec(
repair_suggested_url(
self.original_url,
(&attribute.name.local, &attribute.value),
),
&mut self.returned_vec,
&self.fetched_cache,
);
}
}
}
ParseError(error) => {
warn!("error parsing html for {}: {:?}", self.original_url, error);
}
_ => {}
}
return TokenSinkResult::Continue;
}
}
let html = Sink {
original_url: original_url,
returned_vec: Vec::new(),
fetched_cache: fetched_cache,
};
let mut byte_tendril = ByteTendril::new();
{
let tendril_push_result = byte_tendril.try_push_bytes(&raw_html.into_bytes());
if tendril_push_result.is_err() {
warn!("error pushing bytes to tendril: {:?}", tendril_push_result);
return Vec::new();
}
}
let mut queue = BufferQueue::new();
queue.push_back(byte_tendril.try_reinterpret().unwrap());
let mut tok = Tokenizer::new(html.clone(), std::default::Default::default()); // default default! default?
let feed = tok.feed(&mut queue);
return html.returned_vec;
}
输出结束时没有警告(并且由于 this 为空而由另一个函数引起的 panic )。谁能帮我弄清楚这是怎么回事?
提前致谢。
最佳答案
当我初始化 Tokenizer
,我使用:
let mut tok = Tokenizer::new(html.clone(), std::default::Default::default());
问题是我告诉 Tokenizer 使用 html.<b>clone()</b>
而不是 html
.因此,它正在写 returned_vec
到克隆的对象,而不是 html
.更改一些内容(例如使用具有可变引用的变量)可以解决此问题。
关于rust - 可从方法访问但不能从外部访问的结构属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49859102/