Извлечь письмо HTML Элемент - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь почистить страницу, и я застрял в одной точке. Вот первая HTML часть всей HTML страницы

<article class="mod mod-Treffer" data-teilnehmerid="122085958708">
			
			<div data-wipe="{&quot;listener&quot;: &quot;click&quot;, &quot;name&quot;: &quot;Trefferliste Eintrag zur Detailseite&quot;, &quot;id&quot;: &quot;122085958708&quot;, &quot;synchron&quot;: true}" data-realid="2aeca1d2-2bc5-4070-ac4d-e16b10badca5" data-tnid="122085958708" target="_self">
				
		<div class="mod-hervorhebung">
	<p class="mod-hervorhebung--partnerHervorhebung" data-hervorhebungsstufe="3">Silber Partner</p>

	

	
</div>
		
			<picture class="trefferlisten_logo">
		<source media="(min-width: 768px)" srcset="https://ies.v4all.de/0122/GS/0122/5/8335/49428335_310x190.png">
		
		<img alt="" data-lazy-src="https://ies.v4all.de/0122/GS/0122/5/8335/49428335_310x190.png" src="https://ies.v4all.de/0122/GS/0122/5/8335/49428335_310x190.png">
	</picture>
		
		<h2 data-wipe-name="Titel">A &amp; S Billing Pflege-Service GmbH</h2>
		<p class="d-inline-block mod-Treffer--besteBranche">Ambulante Pflegedienste</p>
		
			
			<div class="mod mod-Stars mod-Stars--" title="2.9/5" data-float="2,9">

		<span class="mod-Stars__text" style="width: 58.000001907348632812500%;">2.9</span>

	</div>
			<span>2.9</span>
			<span>(8)</span>
		
	
		
		<address class="mod mod-AdresseKompakt">
		<p data-wipe-name="Adresse">
			Kirchenberg&nbsp;2‑4, 
			<span class="nobr">
				90482
				Nürnberg
			</span>
			(Mögeldorf)
			
		</p>

		<p class="mod-AdresseKompakt__phoneNumber" data-hochgestellt-position="end" data-wipe-name="Kontaktdaten">(0911) 60 00 99 77</p>

	</address>
		
	
			</div>
			
				<div class="aktionsleiste_kompakt">
		
	<div class="mod-gsSlider mod-gsSlider--noneOnWhite">
		<span class="mod-gsSlider__arrow mod-gsSlider__arrow--arrow" data-direction="left" data-show="false" data-wipe="{&quot;listener&quot;:&quot;click&quot;,&quot;name&quot;:&quot;Trefferliste: Aktionleiste-button-links&quot;}"></span>
		<span class="mod-gsSlider__arrow mod-gsSlider__arrow--arrow" data-direction="right" data-show="false" data-wipe="{&quot;listener&quot;:&quot;click&quot;,&quot;name&quot;:&quot;Trefferliste: Aktionleiste-button-rechts&quot;}"></span>
		<div class="mod-gsSlider__slider" data-initialized="true">
			
			
			
			
			
			
				
		
			<a class="contains-icon-homepage gs-btn" target="_blank" rel=" noopener" href="http://www.as-billing.de" data-wipe="{&quot;listener&quot;:&quot;click&quot;, &quot;name&quot;:&quot;Trefferliste Webseite-Button&quot;, &quot;id&quot;:&quot;122085958708&quot;}" data-isneededpromise="false">Webseite</a>
			
		

		
	
			
				
		
			<a class="contains-icon-email gs-btn" href="mailto:info@as-billing.de?subject=Anfrage%20%C3%BCber%20Gelbe%20Seiten" data-wipe="{&quot;listener&quot;:&quot;click&quot;, &quot;name&quot;:&quot;Trefferliste Email-Button&quot;, &quot;id&quot;:&quot;122085958708&quot;}" data-isneededpromise="false">E-Mail</a>
			
		

		
	
			
				
		
			
			<span class="contains-icon-route_finden gs-btn" data-wipe="{&quot;listener&quot;:&quot;click&quot;, &quot;name&quot;:&quot;Trefferliste Navigation-Button&quot;, &quot;id&quot;:&quot;122085958708&quot;}" data-parameters="{&quot;partner&quot;: &quot;googlemaps&quot;, &quot;searchquery&quot;: &quot;A%20%26%20S%20Billing%20Pflege-Service%20GmbH%20Kirchenberg%202-4%2090482%20N%C3%BCrnberg&quot;}" data-target="_blank">Route</span>
		

		
	
			
				
		
			
			<span class="contains-icon-details gs-btn" data-wipe="{&quot;listener&quot;:&quot;click&quot;, &quot;name&quot;:&quot;Trefferliste Actionbutton Mehr Details&quot;, &quot;id&quot;:&quot;122085958708&quot;}" data-parameters="{&quot;partner&quot;: &quot;gs&quot;, &quot;realId&quot;: &quot;2aeca1d2-2bc5-4070-ac4d-e16b10badca5&quot;, &quot;tnId&quot;: &quot;122085958708&quot;}">Mehr Details</span>
		

		
	
			
			
		</div>
	</div>

	</div>
			
			
			
			
		</article>

Я впервые использовал эти строки

Dim post As Object

Set post = html.querySelectorAll(".mod-Treffer")

For i = 0 To post.Length - 1
Debug.Print post.Item(i).getElementsByTagName("h2")(0).innerText
Debug.Print post.Item(i).getElementsByTagName("Address")(0).getElementsByTagName("p")(1).innerText

'I am stuck with extracting the email
'HERE
Next i

Более того, иногда объект записи не имеет информации электронной почты, поэтому мне нужно извлечь только, если найден .

Это код до сих пор

    Const sURL As String = "https://www.gelbeseiten.de/Suche/Ambulante%20Pflegedienste/Bundesweit"
Dim http As MSXML2.XMLHTTP60, html As HTMLDocument

Set http = New MSXML2.XMLHTTP60
Set html = New MSHTML.HTMLDocument

With http
    .Open "Get", sURL, False
    .send
    html.body.innerHTML = .responseText
End With

Dim post As Object

Set post = html.querySelectorAll(".mod-Treffer")

Dim i As Long, r As Long
Range("A1").Resize(1, 3).Value = Array("Title", "Phone", "Email")
r = 2

For i = 0 To post.Length - 1
Cells(r, 1).Value = post.Item(i).getElementsByTagName("h2")(0).innerText
Cells(r, 2).Value = post.Item(i).getElementsByTagName("Address")(0).getElementsByTagName("p")(1).innerText


Next i

Вот снимок части электронной почты enter image description here

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Исходный вопрос:

В этом случае я бы использовал селектор attribute = value с оператором contains для назначения атрибута href строкой mailto. Добавьте селектор css: [href*=mailto]

Если вы используете querySelectorAll("[href*=mailto]"), вы можете проверить, является ли свойство .Length больше 0 или использовать querySelector и проверить if Not querySelector("[href*=mailto]") Is Nothing.

Если вы установите переменную

Dim ele As Object

Set ele = html.document.querySelector("[href*=mailto]")
If Not ele Is Nothing Then
    Debug.Print ele.href  'do something with the href to parse out email
End If

Обновленный вопрос:

Для обновленного вопроса я перенесу текущий узел, в nodeList, outerHTML в суррогатную переменную HTMLDocument, чтобы я мог снова использовать метод querySelector. Я бы выбрал адрес электронной почты по классам.

Option Explicit

Public Sub GetListingInfo()

    Const URL As String = "https://www.gelbeseiten.de/Suche/Ambulante%20Pflegedienste/Bundesweit"
    Dim http As MSXML2.XMLHTTP60, html As MSHTML.HTMLDocument

    Set http = New MSXML2.XMLHTTP60
    Set html = New MSHTML.HTMLDocument

    With http
        .Open "Get", URL, False
        .send
        html.body.innerHTML = .responseText
    End With

    Dim post As Object, html2 As MSHTML.HTMLDocument

    Set post = html.querySelectorAll(".mod-Treffer")
    Set html2 = New MSHTML.HTMLDocument

    Dim i As Long, emailNode As Object

    With ActiveSheet

        .Range("A1").Resize(1, 3).Value = Array("Title", "Phone", "Email")

        For i = 0 To post.Length - 1

            html2.body.innerHTML = post.Item(i).outerHTML

            .Cells(i + 2, 1).Value = html2.querySelector("h2").innerText
            .Cells(i + 2, 2).Value = html2.querySelector(".mod-AdresseKompakt__phoneNumber").innerText

            Set emailNode = html2.querySelector(".contains-icon-email")

            If Not emailNode Is Nothing Then .Cells(i + 2, 3).Value = Replace$(emailNode.href, "mailto:", vbNullString)
        Next i
    End With
End Sub
0 голосов
/ 31 марта 2020

Спасибо большое. Я мог бы понять это, используя эти строки

    If InStr(post.Item(i).getElementsByTagName("a")(1).href, "mailto:") Then
    Debug.Print Split(Split(post.Item(i).getElementsByTagName("a")(1).href, "mailto:")(1), "?")(0)
End If

Но я приветствую любые другие предложения, чтобы улучшить и узнать больше. * После тестирования я обнаружил ошибку, если электронная почта не найдена в элементе. Как избежать ошибки? Я могу использовать On Error Resume Next. Но у меня есть желание обработать ошибку, а не пропускать ее.

** Редактировать: я мог бы решить вторую точку, используя эту структуру

    Dim emailObj As Object

Set emailObj = post.Item(i).getElementsByTagName("a")(1)
If Not emailObj Is Nothing Then
 If InStr(post.Item(i).getElementsByTagName("a")(1).href, "mailto:") Then
    Debug.Print Split(Split(post.Item(i).getElementsByTagName("a")(1).href, "mailto:")(1), "?")(0)
End If

код работает, но иногда электронная почта не захватывается правильно .. из-за этой строки

Set emailObj = post.Item(i).getElementsByTagName("a")(1)

Иногда объект не назначается 1. Итак, мой последний вопрос: как я могу получить данные электронной почты независимо от назначенного номера?

Внутри l oop я попробовал эту строку и поиграл без толку

Set aNodeList = post.Item(i).querySelectorAll(".contains-icon-email")(0)
...