XPath:选择第一个 Div 属性与条件匹配的子体的所有文本



请考虑以下代码:

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']

我不确定这是否可以使用兄弟选择器而不是后代来完成

对于特定网址:

来自 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。我敢肯定,有一个简单的作品我没有放在一起。

我仍然不完全确定你在追求什么,但让我们从这个开始,让我知道如何修改结果,如有必要:

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('=====')

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

最新更新