XPath:选择第一个Div属性匹配条件的后代所有文本

时间:2019-11-23 19:18:37

标签: python xpath lxml

请考虑以下代码:

from lxml import html
import requests

page = requests.get('https://advisorless.substack.com/?no_cover=true')
tree = html.fromstring(page.content)

在HTML中,相关部分类似于:

<div class="body markup">
  <p>123</p>
  <a href=''>456</a>
</div>

<div class="body markup">
  <p>ABC</p>
  <p>DEF</p>
</div>

尝试1

tree.xpath('//div[@class="body markup"]/descendant::*/text()')

产生以下结果:['123', '456', 'ABC', 'DEF']

尝试2

tree.xpath('//div[@class="body markup"]/descendant::*/text()')[0]

产生以下结果:['123']

我想要得到的东西 ['123', '456']

我不确定是否可以使用同级选择器而不是后代来完成

对于特定URL:

以下来自Inspect Element的代码是我想要的结果;尽管我的代码需要更动态的东西。其中div [3]是class =“ body markup”的div:

//*[@id="main"]/div[2]/div[2]/div[1]/div/article/div[3]/descendant::*/text()')

为了更加具体,这也可以:

//div[@class="post-list"]/div[1]/div/article[@class="post"]/div[@class="body markup"]/descendant::*/text()

这是我不知道如何修改的一个静态div。我敢肯定,有一个简单的东西我没有放在一起。

1 个答案:

答案 0 :(得分:0)

我仍然不确定您要做什么,但让我们从此开始,让我知道如何修改结果(如果必要):

import requests
from lxml import html

url = "https://advisorless.substack.com/?no_cover=true"
resp = requests.get(url)

root = html.fromstring(resp.text)
targets = root.xpath("//div[@class='body markup'][./p][./a]")
for target in targets:
    print(target.text_content())
    for link in target.xpath('a'):
        print(link.attrib['href'])
    print('=====')

输出内容太长,无法在此处重现,但请查看它是否符合您的期望输出。