请考虑以下代码:
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('=====')
输出太长,无法在此处重现,但请查看它是否符合您想要的输出。