Go 爬虫 解析 xml

Go 爬虫抓取解析 xml

导入爬虫用到的库

Python
import ( "encoding/xml" // xml 标准库 "fmt" // 打印" "io/ioutil" // ioutil 包实现了一些 I/O 实用函数。 "net/http" // http 请求库 )
1
2
3
4
5
6
7
8
9
10
11
import (
     "encoding/xml"
     / / xml 标准库
     "fmt"
     / / 打印 "
    " io / ioutil "
    // ioutil 包实现了一些 I/O 实用函数。
    " net / http"
     / / http 请求库
)
 

定义抓取函数

Python
// 抓取 url xml 返回 []byte func getXML(url string) ([]byte, error) { resp, err := http.Get(url) // 请求 url if err != nil { return []byte{}, fmt.Errorf("GET error: %v", err) } defer resp.Body.Close() // 清理内存 if resp.StatusCode != http.StatusOK { return []byte{}, fmt.Errorf("Status error: %v", resp.StatusCode) } // 根据状态码 判断是否正常 data, err := ioutil.ReadAll(resp.Body) if err != nil { return []byte{}, fmt.Errorf("Read body: %v", err) } return data, nil }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/ / 抓取 url xml 返回 [ ] byte
func getXML ( url string ) ( [ ] byte , error ) {
     resp , err : = http . Get ( url )
     / / 请求 url
     if err != nil {
         return [ ] byte { } , fmt . Errorf ( "GET error: %v" , err )
     }
     defer resp . Body . Close ( )
     / / 清理内存
 
     if resp . StatusCode != http . StatusOK {
         return [ ] byte { } , fmt . Errorf ( "Status error: %v" , resp . StatusCode )
     }
     / / 根据状态码 判断是否正常
 
     data , err : = ioutil . ReadAll ( resp . Body )
     if err != nil {
         return [ ] byte { } , fmt . Errorf ( "Read body: %v" , err )
     }
 
     return data , nil
}
 

xml 格式

定义xml 的 struct

Python
type rss struct { XMLName xml.Name `xml:"rss"` Items []itemD `xml:"channel>item"` } type itemD struct { Title string `xml:"title"` PubDate string `xml:"pubDate"` Link string `xml:"link"` }
1
2
3
4
5
6
7
8
9
10
11
type rss struct {
     XMLName xml . Name ` xml : "rss" `
     Items [ ] itemD ` xml : "channel>item" `
}
 
type itemD struct {
     Title string ` xml : "title" `
     PubDate string ` xml : "pubDate" `
     Link string ` xml : "link" `
}
 

struct 和 xml 格式对应

rss struct 对应 xml

itemD struct 对应 xml

主函数

Python
func main() { url :="https://rsshub.app/fx678/kx" bytes,_:= getXML(url) var ss rss xml.Unmarshal(bytes,&ss) // 解包 for index, value := range ss.Items{ fmt.Println(index,value.Link, value.PubDate, value.Title) } // 由于 ss.Items 是个数组,所以采用 for 循环遍历 }
1
2
3
4
5
6
7
8
9
10
11
12
13
func main ( ) {
     url : = "https://rsshub.app/fx678/kx"
     bytes , _ : = getXML ( url )
     var ss rss
     xml . Unmarshal ( bytes , & ss )
     / / 解包
     for index , value : = range ss . Items {
         fmt . Println ( index , value . Link , value . PubDate , value . Title )
     }
/ /   由于 ss . Items 是个数组,所以采用 for 循环遍历
 
}
 

输出如下:

全部代码如下:

Python
package main import ( "encoding/xml" "fmt" "io/ioutil" "net/http" ) // 抓取 url xml 返回 []byte func getXML(url string) ([]byte, error) { resp, err := http.Get(url) // 请求 url if err != nil { return []byte{}, fmt.Errorf("GET error: %v", err) } defer resp.Body.Close() // 清理内存 if resp.StatusCode != http.StatusOK { return []byte{}, fmt.Errorf("Status error: %v", resp.StatusCode) } // 根据状态码 判断是否正常 data, err := ioutil.ReadAll(resp.Body) if err != nil { return []byte{}, fmt.Errorf("Read body: %v", err) } return data, nil } type rss struct { XMLName xml.Name `xml:"rss"` Items []itemD `xml:"channel>item"` } type itemD struct { Title string `xml:"title"` PubDate string `xml:"pubDate"` Link string `xml:"link"` } // 变量一定要大写 // 定义结构体 func main() { url :="https://rsshub.app/fx678/kx" bytes,_:= getXML(url) var ss rss xml.Unmarshal(bytes,&ss) for index, value := range ss.Items{ fmt.Println(index,value.Link, value.PubDate, value.Title) } // 由于 ss.Items 是个数组,所以采用 for 循环遍历 }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package main
 
import (
     "encoding/xml"
     "fmt"
     "io/ioutil"
     "net/http"
)
 
/ / 抓取 url xml 返回 [ ] byte
func getXML ( url string ) ( [ ] byte , error ) {
     resp , err : = http . Get ( url )
     / / 请求 url
     if err != nil {
         return [ ] byte { } , fmt . Errorf ( "GET error: %v" , err )
     }
     defer resp . Body . Close ( )
     / / 清理内存
 
     if resp . StatusCode != http . StatusOK {
         return [ ] byte { } , fmt . Errorf ( "Status error: %v" , resp . StatusCode )
     }
     / / 根据状态码 判断是否正常
 
     data , err : = ioutil . ReadAll ( resp . Body )
     if err != nil {
         return [ ] byte { } , fmt . Errorf ( "Read body: %v" , err )
     }
 
     return data , nil
}
 
 
type rss struct {
     XMLName xml . Name ` xml : "rss" `
     Items [ ] itemD ` xml : "channel>item" `
}
 
type itemD struct {
     Title string ` xml : "title" `
     PubDate string ` xml : "pubDate" `
     Link string ` xml : "link" `
}
/ / 变量一定要大写
/ / 定义结构体
 
func main ( ) {
     url : = "https://rsshub.app/fx678/kx"
     bytes , _ : = getXML ( url )
     var ss rss
     xml . Unmarshal ( bytes , & ss )
 
     for index , value : = range ss . Items {
         fmt . Println ( index , value . Link , value . PubDate , value . Title )
     }
/ /   由于 ss . Items 是个数组,所以采用 for 循环遍历
 
}
 
 

另外一个库 更方便 etree

Python
package main import ( "fmt" "github.com/levigross/grequests" ) import "github.com/beevik/etree" func main() { url := "https://rsshub.app/fx678/kx" xml_source, _ := grequests.Get(url, nil) doc := etree.NewDocument() if err := doc.ReadFromString(xml_source.String()); err != nil { panic(err) } root := doc.SelectElement("rss") root = root.SelectElement("channel") for _, item := range root.SelectElements("item") { title := item.SelectElement("title").Text() url := item.SelectElement("link").Text() fmt.Println(title, url) } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main
 
import (
     "fmt"
     "github.com/levigross/grequests"
)
import "github.com/beevik/etree"
 
func main ( ) {
     url : = "https://rsshub.app/fx678/kx"
     xml_source , _ : = grequests . Get ( url , nil )
     doc : = etree . NewDocument ( )
     if err : = doc . ReadFromString ( xml_source . String ( ) ) ; err != nil {
         panic ( err )
     }
     root : = doc . SelectElement ( "rss" )
     root = root . SelectElement ( "channel" )
     for _ , item : = range root . SelectElements ( "item" ) {
         title : = item . SelectElement ( "title" ) . Text ( )
         url : = item . SelectElement ( "link" ) . Text ( )
         fmt . Println ( title , url )
     }
 
}
 
 



  • zeropython 微信公众号 5868037 QQ号 5868037@qq.com QQ邮箱
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当需要爬取网页数据并生成XML格式文件时,可以使用Python中的一些库来实现。以下是一种常用的方法: 1. 首先,你需要安装并导入`requests`库来发送HTTP请求,以获取网页内容。可以使用以下命令来安装: ``` pip install requests ``` 2. 接下来,你需要安装并导入`beautifulsoup4`库来解析HTML或XML文档,提取所需数据。可以使用以下命令来安装: ``` pip install beautifulsoup4 ``` 3. 然后,你可以使用`requests`库发送GET或POST请求获取网页内容。例如,使用`requests.get()`方法发送GET请求: ```python import requests url = "http://example.com" # 替换为你要爬取的网页URL response = requests.get(url) content = response.text # 获取网页内容 ``` 4. 接下来,你可以使用`beautifulsoup4`库解析网页内容,并提取所需的数据。例如,使用`BeautifulSoup`类解析HTML或XML文档: ```python from bs4 import BeautifulSoup soup = BeautifulSoup(content, "html.parser") # 解析HTML或XML文档 # 提取所需的数据 data = soup.find("div", {"class": "example"}) ``` 5. 最后,你可以使用Python内置的`xml.etree.ElementTree`模块创建XML文件,并将提取到的数据写入XML文件中。例如: ```python import xml.etree.ElementTree as ET root = ET.Element("root") # 创建根节点 child = ET.SubElement(root, "child") # 创建子节点 child.text = data.text # 设置节点文本 tree = ET.ElementTree(root) # 创建ElementTree对象 tree.write("data.xml", encoding="utf-8", xml_declaration=True) # 将数据写入XML文件 ``` 以上就是使用Python爬虫生成XML文件的基本流程。你可以根据自己的需求对代码进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值