【发布时间】:2016-08-01 16:18:51
【问题描述】:
我正在学习 R 来抓取大型 XML(最大 100mb),所以绝对不是专业人士。 XML 文件遵循非常严格的格式:每个节点都是一个交易,涉及卖家(一个或多个)、买家(一个或多个)和转移的股票类型(一个或多个)。每一个都有一个或多个详细信息(姓名、地址等)。这是一个匿名的 sn-p:
<deals>
<deal>
<sellers>
<seller>
<name>Dave</name>
<address>Street name</address>
<city>New York, NY</city>
</seller>
</sellers>
<buyers>
<buyer>
<name>John</name>
<city>Denver, CO</city>
<phone>123456789</phone>
</buyer>
<buyer>
<name>Pete</name>
<address>Avenue name</address>
<city>Kansas, MI</city>
</buyer>
</buyers>
<stocks>
<stock>
<id>GOOGL</id>
</stock>
<stock>
<id>MSFT</id>
<id>0000789019</id>
</stock>
</stocks>
</deal>
<deal>
<sellers>
<seller>
<name>Linda</name>
<city>Philadelphia, PA</city>
<phone>876-543-210</phone>
</seller>
<seller>
<name>Anne</name>
<address>Road name</address>
</seller>
</sellers>
<buyers>
<buyer>
<name>Monica</name>
<address>Alley name</address>
<city>Pensacola, CA</city>
</buyer>
</buyers>
<stocks>
<stock>
<id>INTC</id>
<id>0000050863</id>
</stock>
<stock>
<id>DELL</id>
</stock>
<stock>
<id>HPQ</id>
<id>0000047217</id>
</stock>
</stocks>
</deal>
</deals>
在尝试抓取数据时,问题出在“一个或多个”上。现在,我只想创建一个包含交易号(序列号)和卖家信息的数据框,并使用以下代码:
xmldata <- xmlRoot(xmlTreeParse("snippet.xml", useInternalNodes = TRUE))
seller_name <- xpathSApply(xmldata, "//deal/sellers/seller/name", xmlValue)
seller_address <- xpathSApply(xmldata, "//deal/sellers/seller/address", xmlValue)
seller_city <- xpathSApply(xmldata, "//deal/sellers/seller/city", xmlValue)
seller_phone <- xpathSApply(xmldata, "//deal/sellers/seller/phone", xmlValue)
不幸的是,这不起作用有两个原因。首先,我无法确定哪个卖家属于哪个交易。其次,由于许多细节是可选的(地址、城市、电话号码),向量的长度各不相同,我无法分辨街道名称或电话号码属于谁:
> seller_name
[1] "Dave" "Linda" "Anne"
> seller_address
[1] "Street name" "Road name"
> seller_phone
[1] "876-543-210"
我尝试使用 for 循环遍历各个交易,但它太慢了。非常感谢任何帮助,谢谢!
【问题讨论】:
-
感谢大家提供的所有出色解决方案!我将尝试实施以下建议并随时为您提供最新信息。
-
首先,很抱歉更新缓慢,感谢您的帮助。不幸的是,事实证明 R 对于大型 XML 文件来说太慢了。最终我选择了另一种解决方案:将 XML 文件作为一个大字符串读取到 Python 中,然后将字符串拆分为交易。对于每笔交易,我选择了卖家、买家和股票(通过拆分子字符串)。然后我再次拆分这些子字符串(针对每个单独的卖家、买家和股票)并进行正则表达式匹配以获取名称、地址等。是的,你没看错:这是一大堆 for 循环,但是仍然比 R 快...