我正在为wunderground.com构建网络刮板,但是我的代码返回了inchs_rain和湿度的“ []”值。谁能知道为什么会这样吗?
# -*- coding: utf-8 -*-
import scrapy
from scrapy.selector import Selector
import time
from wunderground_scraper.items import WundergroundScraperItem
class WundergroundComSpider(scrapy.Spider):
name = "wunderground"
allowed_domains = ["www.wunderground.com"]
start_urls = (
'http://www.wunderground.com/q/zmw:10001.5.99999',
)
def parse(self, response):
info_set = Selector(response).xpath('//div[@id="current"]')
list = []
for i in info_set:
item = WundergroundScraperItem()
item['description'] = i.xpath('div/div/div/div/span/text()').extract()
item['description'] = item['description'][0]
item['humidity'] = i.xpath('div/table/tbody/tr/td/span/span/text()').extract()
item['inches_rain'] = i.xpath('div/table/tbody/tr/td/span/span/text()').extract()
list.append(item)
return list
Run Code Online (Sandbox Code Playgroud)
我也知道湿度和inches_rain项目设置为相同的xpath,但这应该是正确的,因为一旦信息进入数组,我就将它们设置为数组中的某些值。
我是在R中解析XML的新手.我正在尝试将XML解析为可行的数据框.我已经尝试了XML包中的一些XPath函数,但似乎无法得出正确的答案.
这是我的XML:
<ResidentialProperty>
<Listing>
<StreetAddress>
<StreetNumber>11111</StreetNumber>
<StreetName>111th</StreetName>
<StreetSuffix>Avenue Ct</StreetSuffix>
<StateOrProvince>WA</StateOrProvince>
</StreetAddress>
<MLSInformation>
<ListingStatus Status="Active"/>
<StatusChangeDate>2015-07-05T23:48:53.410</StatusChangeDate>
</MLSInformation>
<GeographicData>
<Latitude>11.111111</Latitude>
<Longitude>-111.111111</Longitude>
<County>Pierce</County>
</GeographicData>
<SchoolData>
<SchoolDistrict>Puyallup</SchoolDistrict>
</SchoolData>
<View>Territorial</View>
</Listing>
<YearBuilt>1997</YearBuilt>
<InteriorFeatures>Bath Off Master,Dbl Pane/Storm Windw</InteriorFeatures>
<Occupant>
<Name>Vacant</Name>
</Occupant>
<WaterFront/>
<Roof>Composition</Roof>
<Exterior>Brick,Cement Planked,Wood,Wood Products</
</ResidentialProperty>
Run Code Online (Sandbox Code Playgroud)
当我跑:
ResidentialProperty <- xmlToDataFrame(nodes=getNodeSet(doc,"//ResidentialProperty"))
Run Code Online (Sandbox Code Playgroud)
父节点中子节点的值被压缩为:
11111111thAvenue CtWA2015-07-05T23:48:53.41011.111111-111.111111PiercePuyallupTerritorial
Run Code Online (Sandbox Code Playgroud)
如果我向下移动一个节点,则会发生同样的事情:
11111111thAvenue CtWA
Run Code Online (Sandbox Code Playgroud)
子节点的值全部粘贴在一起.
我也试过一种有点工作的蛮力方法:
StreetAddress <- xmlToDataFrame(nodes=getNodeSet(doc,"//StreetAddress"))
MLSInformation <- xmlToDataFrame(nodes=getNodeSet(doc,"//MLSInformation"))
GeographicData <- xmlToDataFrame(nodes=getNodeSet(doc,"//GeographicData"))
SchoolData <- xmlToDataFrame(nodes=getNodeSet(doc,"//SchoolData"))
YearBuilt <- xmlToDataFrame(nodes=getNodeSet(doc,"//YearBuilt"))
InteriorFeatures <- xmlToDataFrame(nodes=getNodeSet(doc,"//InteriorFeatures"))
Occupant <- xmlToDataFrame(nodes=getNodeSet(doc,"//Occupant"))
Roof <- xmlToDataFrame(nodes=getNodeSet(doc,"//Roof"))
Exterior <- xmlToDataFrame(nodes=getNodeSet(doc,"//Exterior")) …Run Code Online (Sandbox Code Playgroud) 我需要一些帮助来提出一个适当的XPath表达式来从XML中提取值.
我可以使用jaxb获取值,但是我需要xpath,因为我有一个决策表类型的映射规则,我想要外部化,如果我使用jaxb将导致很多嵌套的if/else语句,我想避免,因此需要xpath方法.
我有一个xml文件,至少有4个模式构建.我的意思是根模式在特定点有一个元素,表示xs:any,在这个位置注入一个基于不同模式的xml,这反过来又有一个类似的xs:any注入另一个xml来构建final /我使用的实际xml.
这是我正在处理的实际XML结构(我故意修改了值).下面xml中的两个Document节点基于不同的模式
<?xml version="1.0"?>
<env:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:env="CDTS-SUBMIT">
<env:Body>
<cdtPrefix>
<cdtprVersion>01</cdtprVersion>
<cdtprOperation>SUBMIT</cdtprOperation>
<cdtprFunction>GCAMS1O</cdtprFunction>
<cdtprDirectionFlag>O</cdtprDirectionFlag>
</cdtPrefix>
<cdtDataDescription>
<cdtddVersion>01</cdtddVersion>
<cdtddFirmId>ABC</cdtddFirmId>
<cdtddBusinessDataFormat>GCAMS1O-XML</cdtddBusinessDataFormat>
<cdtddReferenceNum>123</cdtddReferenceNum>
<cdtddTrackingNum>123</cdtddTrackingNum>
<cdtddDestination>AQ</cdtddDestination>
<cdtddSeqNum>0000000</cdtddSeqNum>
<cdtddCycleNum>00</cdtddCycleNum>
<cdtddBusinessDate>00000000</cdtddBusinessDate>
</cdtDataDescription>
<cdtBusinessData>
<AppHdr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Fr>
<FIId>
<FinInstnId>
<BICFI>ABC</BICFI>
</FinInstnId>
</FIId>
</Fr>
<To>
<FIId>
<FinInstnId>
<BICFI>ABC </BICFI>
</FinInstnId>
</FIId>
</To>
<BizMsgIdr>ABC</BizMsgIdr>
<MsgDefIdr>seev.031.002.05</MsgDefIdr>
<BizSvc>CSD</BizSvc>
<CreDt>9999-99-99T00:02:17Z</CreDt>
</AppHdr>
<Document xmlns="urn:swift:xsd:seev.031.002.05" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CorpActnNtfctn>
<NtfctnGnlInf>
<NtfctnTp>REPL</NtfctnTp>
<PrcgSts>
<Cd>
<EvtCmpltnsSts>COMP</EvtCmpltnsSts>
<EvtConfSts>CONF</EvtConfSts>
</Cd>
</PrcgSts>
</NtfctnGnlInf>
<PrvsNtfctnId>
<Id>00000000</Id>
</PrvsNtfctnId>
<EvtsLkg>
<EvtId>
<LkdOffclCorpActnEvtId>US8</LkdOffclCorpActnEvtId>
</EvtId>
<LkgTp>
<Cd>INFO</Cd>
</LkgTp>
</EvtsLkg>
<CorpActnGnlInf>
<CorpActnEvtId>000</CorpActnEvtId>
<OffclCorpActnEvtId>US7</OffclCorpActnEvtId> …Run Code Online (Sandbox Code Playgroud) 我有以下XML:
<root>
<level name="level1">
<!-- More children <level> -->
</level>
<level name="level2">
<!-- Some more children <level> -->
</level>
</root>
Run Code Online (Sandbox Code Playgroud)
我怎样才能<level>直接提取一个,<root>以便我可以运行一个XPath查询,例如$xml->xpath('//some-query')相对于所提取的<level>?
我有以下xml
<test>
<nodeA>
<nodeB>key</nodeB>
<nodeC>value1</nodeC>
</nodeA>
<nodeA>
<nodeB>key</nodeB>
<nodeC>value2</nodeC>
</nodeA>
</test>
Run Code Online (Sandbox Code Playgroud)
如何连接并获取xpath中的所有值/test/nodeA/nodeC?我在这种情况下的预期输出是value1value2
我不确定从我读过的内容可以用xpath,但谢谢你的帮助.
PS:我使用Ximpleware的VTD-XML在Java中解析它.任何基于Java的解决方案也欢迎.目前我的java解决方案只提供第一个值,即value1
假设我有一个XML文档定义:
<people>
<person>
<city>London</city>
</person>
<person>
<city>Paris</city>
</person>
</people>
Run Code Online (Sandbox Code Playgroud)
我想要一个检查每个人住在伦敦的图示器.
我试过了:
<sch:rule context="people">
<sch:assert test="person/city = 'London'">Everybody must live in London!</sch:assert>
</sch:rule>
Run Code Online (Sandbox Code Playgroud)
但是,只要有一个人居住在伦敦,这种情况就会恢复正常.有没有办法告诉schematron将测试应用于匹配XPathcondition人/城市的每个元素?
我正在尝试从xml文件中删除元素和子元素。特别是名称为Testlogging的追加程序。
首先,这是我的xml文件的外观。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="null" threshold="null">
<appender class="DailyLogFileAppender" name="Testlogging">
<param name="encoding" value="UTF-8"/>
<param name="MaxFileSize" value="100MB"/>
<param name="MaxBackupIndex" value="2"/>
<param name="rootDir" value="c:\Logs"/>
<param name="componentId" value="Testlogging"/>
<param name="DatePattern" value="yyyyMMdd"/>
<layout class="SyslogPatternLayout">
<param ConversionPattern="%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} [%-5p] {%t} %c [%D] - %m%n"/>
</layout>
</appender>
Run Code Online (Sandbox Code Playgroud)
这是我的Java代码:
DocumentBuilderFactory dbfact = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbfact.newDocumentBuilder();
Document d = builder.parse(xmlFile);
XPath xp = XPathFactory.newInstance().newXPath();
NodeList nl = (NodeList)xp.compile("//appender").evaluate(d,XPathConstants.NODESET);
for(int i = 0; i < nl.getLength(); i++)
{
if(xp.compile("./@name").evaluate(nl.item(i)).equals("Testlogging"))
{
Node node …Run Code Online (Sandbox Code Playgroud) 我想使用python中的request包从xpath提取URL。我可以得到文本,但没有尝试给出URL。有人可以帮忙吗?
ipdb> webpage.xpath(xpath_url + '/text()')
['Text of the URL']
ipdb> webpage.xpath(xpath_url + '/a()')
*** lxml.etree.XPathEvalError: Invalid expression
ipdb> webpage.xpath(xpath_url + '/href()')
*** lxml.etree.XPathEvalError: Invalid expression
ipdb> webpage.xpath(xpath_url + '/url()')
*** lxml.etree.XPathEvalError: Invalid expression
Run Code Online (Sandbox Code Playgroud)
我使用本教程开始学习:http : //docs.python-guide.org/en/latest/scenarios/scrape/
看起来应该很容易,但是在搜索过程中什么都没有发生。
谢谢。
我喜欢使用seleniumin 在页面中选择此标记java
<input class="btn btn-success addReportBtn" type="submit" />
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所尝试的:
driver.findElement(By.xpath("//input[type=submit]"));
driver.findElement(By.cssSelector("//input[@type='submit']"));
Run Code Online (Sandbox Code Playgroud)
我分别得到了这两个例外:
org.openqa.selenium.NoSuchElementException:没有这样的元素:无法定位元素:{"method":"xpath","selector":"input [type = submit]"}
org.openqa.selenium.InvalidSelectorException:无效的选择器:指定了无效或非法的选择器
如果我使用Jsoup我可以通过以下方式轻松实现:
System.out.println(document.select("input[type=submit]"));
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
为什么我从该模板作为返回值成为真:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template name="return-false">
<xsl:value-of select="false()"/>
</xsl:template>
<xsl:template match="/">
<root>
<xsl:variable name="call-template">
<xsl:call-template name="return-false"/>
</xsl:variable>
<xsl:if test="$call-template = true()">
<FALSE/>
</xsl:if>
</root>
</xsl:template>
</xsl:stylesheet>Run Code Online (Sandbox Code Playgroud)
xpath ×10
xml ×7
java ×3
python ×2
dataframe ×1
jxpath ×1
lxml ×1
php ×1
python-3.x ×1
r ×1
removechild ×1
schematron ×1
scrapy ×1
selenium ×1
vtd-xml ×1
web-scraping ×1
xml-parsing ×1
xquery ×1
xslt ×1