使用 xpath 从 ul 中选择 li 元素

新手上路,请多包涵

I’m starting with XPATH from lxml on Python3 and I’m unable to get the right sintaxis to select all li elements with ul 的内容。我正在尝试这种结构:

 <body>
 <div> ..... </div>
 <div> ..... </div>
 <div id="div-A">
  <div id="subdiv-1">
   <form> ... </form>
   <div> ..... </div>
   <div> ..... </div>
   <ul>
    <li>
     <div id="div-1">
      <div> ..... </div>
      <div> ..... </div>
      <div id="subdiv-1">
       <a class="name">
        <span>
          ....text1....
        </span>
       </a>
      </div>
      <div id="subdiv-2">
       <div class="class-1">
        <div class="subClass-1">
         <div> ....text2.... </div>
        </div>
        <span class="subClass-2">
         ....text3....
        </span>
       </div>
      </div>
     </div>
    </li>
    ... x23...
   </ul>
  </div>
 </div>
</body>

我的目标是能够获得 text1text2text3

所以首先,我尝试获取所有 li 元素及其内容:

 content = html_response.content
fixed_content = fromstring(content)  # parse the HTML and correct malformed HTML
items = fixed_content.xpath('//ul/li/*')

并将 items 传递给带有 for 循环的函数以迭代 23 li 元素。现在我尝试获取文本,所以:

 for item in items:
 text1 = item.xpath('/div[@id="div-1"]/div[@id="subdiv-1"]/a[@class="name"]/span').text_content()
 text2 = item.xpath('/div[@id="div-1"]/div[@id="subdiv-2"]/div[@class="class-1"]/div[@class="subClass-1"]/div').text_content()
 text3 = item.xpath('/div[@id="div-1"]/div[@id="subdiv-2"]/div[@class="class-1"]/div[@class="subClass-2"]/span[@class="subClass-2"]').text_content()

但是我在所有情况下都得到一个没有内容的空结果。我做错了什么?

问候。

原文由 MinionAttack 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

尝试以下代码以获得所需的输出:

 items = fixed_content.xpath('//ul/li//span | //ul/li//div[@class="subClass-1"]')
for item in items:
    item.text_content().strip()

输出是

'....text1....'
'....text2....'
'....text3....'

或者

items = fixed_content.xpath('//ul/li')
for item in items:
    text1 = item.xpath('.//a[@class="name"]/span')[0].text_content().strip()
    text2 = item.xpath('.//div[@class="subClass-1"]')[0].text_content().strip()
    text3 = item.xpath('.//span[@class="subClass-2"]')[0].text_content().strip()

如果您想将每个文本节点作为变量

原文由 Andersson 发布,翻译遵循 CC BY-SA 4.0 许可协议

您的 xpath 查询似乎为我提供了想要的输出。 text1、text2 和 text3 完全写出时的结果。使用 string() 方法,您可以选择找到的元素的内部文本值:

 //ul/li/div[@id="div-1"]/div[@id="subdiv-1"]/a[@class="name"]/span/string(),
//ul/li/div[@id="div-1"]/div[@id="subdiv-2"]/div[@class="class-1"]/div[@class="subClass-1"]/div/string(),
//ul/li/div[@id="div-1"]/div[@id="subdiv-2"]/div[@class="class-1"]/span[@class="subClass-2"]/string()

将它们写出来并使用 string() 方法不会为您提供预期的 text1-3 值吗?

原文由 Lesleyvdp 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题