我正在尝试构建HTML网络抓取工具,并且遇到了无法逾越的障碍。
#![feature(libc)]
#![feature(rustc_private)]
extern crate libc;
extern crate url;
extern crate hyper;
extern crate html5ever;
extern crate serialize;
extern crate html5ever_dom_sink;
#[macro_use]
extern crate tendril;
use tendril::{StrTendril, SliceExt};
use std::ffi::{CStr,CString};
use tendril::{ByteTendril, ReadExt};
use html5ever::{parse, one_input};
use html5ever_dom_sink::common::{Document, Doctype, Text, Comment, Element};
use html5ever_dom_sink::rcdom::{RcDom, Handle};
use hyper::Client;
use hyper::header::Connection;
use std::io::Read;
fn get_page(url: &str) -> String {
let mut client = Client::new();
let mut res = client.get(url)
// set a header
.header(Connection::close())
// let 'er go!
.send().unwrap();
let mut body = String::new();
res.read_to_string(&mut body).unwrap();
body
}
#[no_mangle]
pub extern fn parse_page(url: *const libc::c_char) {
let url_cstr = unsafe { CStr::from_ptr(url) }; // &std::ffi::c_str::CStr
let url_and_str = url_cstr.to_str().unwrap(); // &str
let body = get_page(url_and_str);
let body_tendril = body.to_tendril();
let body_tendril = body_tendril.try_reinterpret().unwrap();
let dom: RcDom = parse(one_input(body_tendril), Default::default());
// let c_body = CString::new(body).unwrap(); // std::ffi::c_str::CString
// c_body.into_ptr()
}
当我用这个库构建cargo
时,出现错误:
error: type mismatch resolving `<core::option::IntoIter<tendril::tendril::Tendril<_>> as core::iter::Iterator>::Item == tendril::tendril::Tendril<tendril::fmt::UTF8>`:
expected struct `tendril::tendril::Tendril`,
found a different struct `tendril::tendril::Tendril`
如何将琴弦转换成正确的解析形式的卷须呢?
这表明您已经tendril
编译了多个版本的板条箱,而您正无意间尝试将它们混合在一起。确保任何东西tendril
都取决于相同的东西tendril
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句