从Linux C调用网页

我需要从http://localhost/index.html这样的URL中读取所有的HTML文本到C中的string

我知道,如果我把telnet -> telnet www.google.com 80 Get webpage....它返回所有的HTML。

我如何在C环境下在Linux环境下执行此操作?

我建议使用一些在大多数Linux发行版上通常可用的库:

libcurl和libxml2

libcurl提供了一套全面的http功能,而libxml2提供了一个解析html的模块,叫做HTMLParser

希望你指出正确的方向

下面是一个粗略的代码轮廓(即没有太多的错误检查,我没有试图编译它)来启动,但使用http://www.tenouk.com/cnlinuxsockettutorials.html学习套接字编程。 如果您需要将主机名(如google.com)翻译为IP地址,请查找gethostbyname。 另外,您可能需要做一些工作来解析HTTP响应中的内容长度,然后确保您继续调用recv,直到获得所有字节。

 #include <netinet/in.h> #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <stdlib.h> void getWebpage(char *buffer, int bufsize, char *ipaddress) { int sockfd; struct sockaddr_in destAddr; if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1){ fprintf(stderr, "Error opening client socket\n"); close(sockfd); return; } destAddr.sin_family = PF_INET; destAddr.sin_port = htons(80); // HTTP port is 80 destAddr.sin_addr.s_addr = inet_addr(ipaddress); // Get int representation of IP memset(&(destAddr.sin_zero), 0, 8); if(connect(sockfd, (struct sockaddr *)&destAddr, sizeof(struct sockaddr)) == -1){ fprintf(stderr, "Error with client connecting to server\n"); close(sockfd); return; } // Send http request char *httprequest = "GET / HTTP/1.0"; send(sockfd, httprequest, strlen(httprequest), 0); recv(sockfd, buffer, bufsize, 0); // Now buffer has the HTTP response which includes the webpage. You can either // trim off the HTTP header, or just leave it in depending on what you are doing // with the page } 

你使用套接字,用HTTP(你有“ http://localhost/index.html ”)查询Web服务器,然后解析你收到的数据。

如果你是套接字编程的初学者,很有帮助: http : //beej.us/guide/bgnet/

如果你真的不想用套接字搞乱,你总是可以创建一个命名的临时文件,从一个进程中分离出来,然后执行execvp()来运行wget -0,然后从那个临时文件中读取输入。

虽然这将是一个相当蹩脚和低效率的方式来做事情,这将意味着你不必乱搞TCP和发送HTTP请求。

假设你知道如何将一个文件读入一个字符串,我试试

 const char *url_contents(const char *url) { // create w3m command and pass it to popen() int bufsize = strlen(url) + 100; char *buf = malloc(bufsize); snprintf(buf, bufsize, "w3m -dump_source '%s'"); // get a file handle, read all the html from it, close, and return FILE *html = popen(buf, "r"); const char *s = read_file_into_string(html); // you write this function fclose(html); return s; } 

你分叉了一个过程,但让w3m完成繁重的工作要容易w3m