能否同时运行两条不同的XPath并捕获结果?
如何同时执行两条XPath并捕获返回值
当然可以实现,下面提供两种实用方案:
方案一:用XPath的联合运算符一次性查询
直接用|运算符把两条XPath合并成一个表达式,一次查询就能返回所有匹配的节点,再提取文本即可:
//div[text()='city']/following-sibling::div | //div[contains(text(),'state')]/following-sibling::div
这个表达式会按节点在HTML中的出现顺序返回结果,对应你的示例结构,会先拿到城市节点(London),再拿到州节点(England)。提取文本后就能得到对应的字符串值。
如果你的HTML里城市标签文本是大小写混合的(比如示例里的City),可以调整XPath来兼容大小写:
//div[lower(normalize-space(text()))='city']/following-sibling::div | //div[contains(lower(normalize-space(text())),'state')]/following-sibling::div
normalize-space用来去除文本前后的空白,lower()统一转小写,避免大小写不匹配的问题。
方案二:代码层面分别执行再组合
如果需要单独处理城市和州的结果(比如判断是否存在、做额外清洗),可以在代码里分别执行两条XPath,再把结果拼接成字符串。以Python的lxml库为例:
from lxml import etree # 你的HTML内容 html_content = """ <div> <div>City</div> <div>London</div> </div> <!--In between some other elements like p, section other divs--> <div> <div>state</div> <div>England</div> </div> """ tree = etree.HTML(html_content) # 提取城市(兼容大小写,用normalize-space和lower处理) city_list = tree.xpath("//div[lower(normalize-space(text()))='city']/following-sibling::div/text()") city = city_list[0] if city_list else "未知城市" # 提取州 state_list = tree.xpath("//div[contains(lower(normalize-space(text())),'state')]/following-sibling::div/text()") state = state_list[0] if state_list else "未知州" # 组合成目标字符串 result_str = f"{city}, {state}" print(result_str) # 输出:London, England
这种方式更灵活,能应对节点缺失的情况,避免直接索引列表导致的报错。
内容的提问来源于stack exchange,提问作者rahul sharma
相关产品推荐
相关产品推荐

