首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用xpath从ul中选择li元素

使用xpath从ul中选择li元素
EN

Stack Overflow用户
提问于 2018-08-30 08:12:21
回答 3查看 13.3K关注 0票数 3

我从lxml on Python3lxml开始,我无法获得正确的正弦化来选择所有具有ul内容的li元素。我试着用这个结构:

代码语言:javascript
复制
<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元素及其内容:

代码语言:javascript
复制
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元素上进行迭代。现在我试着得到短信,所以:

代码语言:javascript
复制
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()

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

致以问候。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-30 08:37:19

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

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

输出是

代码语言:javascript
复制
'....text1....'
'....text2....'
'....text3....'

代码语言:javascript
复制
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()

如果希望将每个文本节点作为变量

票数 2
EN

Stack Overflow用户

发布于 2018-08-30 08:37:08

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

代码语言:javascript
复制
//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 1-3值?

票数 1
EN

Stack Overflow用户

发布于 2018-08-30 10:29:24

代码语言:javascript
复制
[i.strip() for i in tree.xpath('//ul//div[@class="subClass-1"]//text()|//ul//span//text()') if i.strip()]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52092180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档