Używam scrapy, aby uzyskać obiekt typu htmlresponse, na przykład:

<p class="post">
        line1<br />
        line2<br />
        line3<br />
</p>
<p class="post">
        line4<br />
        line5<br />
        line6<br />
</p>

I chcę uzyskać cały tekst między p, ale próbuję:

response.xpath('//p[@class="post"]/text()').extract()

Ale wynik ma 6 wierszy od wiersza1 do wiersza6, a chcę uzyskać cały tekst między znacznikiem p, na przykład: #first p wiersz1 wiersz2 wiersz3 # sekunda p wiersz4 wiersz5 wiersz6 Jak mogę to zrobić?

0
陳建伊 20 grudzień 2019, 05:17
Śpiewasz xslt 1.0/
 – 
Ed Bangga
20 grudzień 2019, 05:55
Czy stackoverflow.com/a/55805214/939364 działa w Twoim przypadku użycia?
 – 
Gallaecio
7 styczeń 2020, 15:37

5 odpowiedzi

Jeśli używasz xslt 2.0 , możesz użyć funkcji string-join.

string-join(//p[@class="post"]/text())
0
Ed Bangga 20 grudzień 2019, 05:56
Używam scrapy, aby uzyskać stronę internetową, która odpowie obiektowi typu htmlresponse, czy mogę do tego użyć xslt?
 – 
陳建伊
20 grudzień 2019, 06:16

Możesz użyć BeautifulSoup również do parsowania html (pip install BeautifulSoup4)

from bs4 import BeautifulSoup

html = """
<p class="post">
        line1<br />
        line2<br />
        line3<br />
</p>
<p class="post">
        line4<br />
        line5<br />
        line6<br />
</p>
"""
soup = BeautifulSoup(html, "html.parser")
p=soup.find_all('p')
for x in p:
  print(x.text)

Wynik:

line1
line2
line3


line4
line5
line6
0
GiovaniSalazar 20 grudzień 2019, 06:04
1
Znam ten sposób, aby uzyskać cały tekst z tagu p, ale używam scrapy, aby uzyskać stronę internetową, która odpowiada obiektowi typu htmlresponse. Może mogę to przetworzyć przez bs4, ale chcę przetworzyć to przez xpath, jeśli ma to metodę.
 – 
陳建伊
20 grudzień 2019, 06:20
Tak, może tylko do parsowania możesz użyć bs4
 – 
GiovaniSalazar
20 grudzień 2019, 06:22

Dlaczego musisz używać XPath? BS4 to dobre rozwiązanie. Tak jest SimplifiedDoc

import requests
from simplified_scrapy.simplified_doc import SimplifiedDoc 
html='''<p class="post">
        line1<br />
        line2<br />
        line3<br />
</p>
<p class="post">
        line4<br />
        line5<br />
        line6<br />
</p>
'''
doc = SimplifiedDoc(html)
p = doc.getElementsByClass('post')
for x in p:
  print (x.html)
  print (doc.removeHtml(x.html,' '))

Wynik:

line1<br />line2<br />line3<br />
line1 line2 line3
line4<br />line5<br />line6<br />
line4 line5 line6
0
dabingsou 20 grudzień 2019, 09:24

Po prostu napisz response.css('p ::text').extract(). Możesz także użyć atrybutu class response.css('.post ::text').extract()

0
Ikram Khan Niazi 20 grudzień 2019, 12:42

Z selektorami scrapy potrzebujesz czegoś takiego:

result = [[line.strip("\n ") for line in p_tag.css("*::text").extract() if line.strip("\n ")]
          for p_tag in response.css("p.post")]

#result= [['line1', 'line2', 'line3'], ['line4', 'line5', 'line6']]
0
Georgiy 21 grudzień 2019, 22:02